Search code examples
pythonpython-3.xiterable-unpacking

Understanding *x ,= lst


I'm going through some old code trying to understand what it does, and I came across this odd statement:

*x ,= p

p is a list in this context. I've been trying to figure out what this statement does. As far as I can tell, it just sets x to the value of p. For example:

p = [1,2]
*x ,= p    
print(x)

Just gives

[1, 2]

So is this any different than x = p? Any idea what this syntax is doing?


Solution

  • *x ,= p is basically an obfuscated version of x = list(p) using extended iterable unpacking. The comma after x is required to make the assignment target a tuple (it could also be a list though).

    *x, = p is different from x = p because the former creates a copy of p (i.e. a new list) while the latter creates a reference to the original list. To illustrate:

    >>> p = [1, 2]
    >>> *x, = p 
    >>> x == p
    True
    >>> x is p
    False
    >>> x = p
    >>> x == p
    True
    >>> x is p
    True