Home > Article > Backend Development > Why Does `x = [4]` Modify `x` but `x = x [4]` Create a New List in Python?
Disparate Behavior: list.__iadd__ vs list.__add__
Consider the following enigmatic Python code:
x = y = [1, 2, 3, 4] x += [4] print(x) # [1, 2, 3, 4, 4] print(y) # [1, 2, 3, 4, 4]
Now, juxtapose it with this code snippet:
x = y = [1, 2, 3, 4] x = x + [4] print(x) # [1, 2, 3, 4, 4] print(y) # [1, 2, 3, 4]
What perplexes us is the stark difference in their behavior. Why does x = [4] alter the original list x, while x = x [4] results in a new list?
The answer lies in Python's object methods. list.__iadd__ mutates the existing list by appending the elements of the second list onto it. Conversely, list.__add__ creates a new list comprising the elements of both input lists.
An expression like x = y first attempts to invoke __iadd__. If __iadd__ is available, it will execute this mutation magic. Otherwise, it will default to __add__, which creates a new list and assigns it to x. Since list class defines __iadd__, the first code snippet mutates the original x list, while the latter code snippet creates a new list and assigns it to x, leaving y unmodified.
The above is the detailed content of Why Does `x = [4]` Modify `x` but `x = x [4]` Create a New List in Python?. For more information, please follow other related articles on the PHP Chinese website!