Weekly backup.
This commit is contained in:
38
20220516125736-difference_entre_les_operateurs_et.org
Normal file
38
20220516125736-difference_entre_les_operateurs_et.org
Normal file
@@ -0,0 +1,38 @@
|
||||
: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]]
|
Reference in New Issue
Block a user