:PROPERTIES: :ID: 24408701-21d8-4f4e-aed9-c58746df2244 :mtime: 20220516142825 :ctime: 20220516125736 :END: #+title: Différence entre les opérateurs + et += * Introduction Comment expliquer la différence de comportement entre les opérateurs *+* et *+=* : #+BEGIN_SRC python :results output a1 = a2 = [1, 2] a1 += [3] # Uses __iadd__, modifies a1 in-place print(f"When += is used: {a1=}, {a2=}") a1 = a2 = [1, 2] a1.extend([3]) # Uses __add__, creates new list, assigns it to b1 print(f"When extend is used: {a1=}, {a2=}") a1 = a2 = [1, 2] a1 = a1 + [3] # Uses __add__, creates new list, assigns it to b1 print(f"When + is used: {a1=}, {a2=}") #+END_SRC #+RESULTS: : When += is used: a1=[1, 2, 3], a2=[1, 2, 3] : When extend is used: a1=[1, 2, 3], a2=[1, 2, 3] : When + is used: a1=[1, 2, 3], a2=[1, 2] * Explications L'opérateur *+=* appelle la méthode dunder *__iadd__*. Si celle-ci n'existe pas (cas des objets /immutables/), il appelle *__add__*: * La méthode *__iadd__* signifie *in-place addition* : cela implique la modification de l'objet /mutable/ (et non la création d'une nouvelle instance - cf. __add__), * La méthode *__add__* retourne un nouvel object contenant le résultat de l'opération. * Références * [[https://stackoverflow.com/questions/2347265/why-does-behave-unexpectedly-on-lists/2347423#2347423][Stackoverflow]]