In Python, the = operator has different functionalities depending on the type of object it's applied to. When used on lists, it raises some unexpected behaviors that can be explained by understanding the underlying special methods it calls.
Generally, = tries to invoke the __iadd__ special method for in-place addition. If it's absent, it resorts to using __add__ instead.
For lists, a mutable type, Python provides a __iadd__ method. When encountering =, Python calls __iadd__ on the list, allowing it to mutate and add an element.
If a list doesn't have a __iadd__ method, Python defaults to __add__. This method creates a new list rather than modifying the original one. As a result, = behaves as if you had assigned a new list using =.
Referencing the code example in the question:
class foo: bar = [] def __init__(self, x): self.bar += [x] class foo2: bar = [] def __init__(self, x): self.bar = self.bar + [x] f = foo(1) g = foo(2) print(f.bar) print(g.bar) f.bar += [3] print(f.bar) print(g.bar) f.bar = f.bar + [4] print(f.bar) print(g.bar) f = foo2(1) g = foo2(2) print(f.bar) print(g.bar)
OUTPUT:
[1, 2] [1, 2] [1, 2, 3] [1, 2, 3] [1, 2, 3, 4] [1, 2, 3] [1] [2]
By understanding the differences between __iadd__ and __add__, you can anticipate the behavior of = on lists, preventing unexpected surprises.
The above is the detailed content of How Does Python's = Operator Behave with Lists and Their __iadd__ and __add__ Methods?. For more information, please follow other related articles on the PHP Chinese website!