In diesem Artikel werden hauptsächlich relevante Informationen darüber vorgestellt, ob die Ausdrücke i += x und i = i + x in Python äquivalent sind. Ich glaube, dass der Artikel einen bestimmten Referenzwert für alle haben wird. Freunde, die es brauchen, können unten vorbeischauen.
Vorwort
Ich habe kürzlich eine Frage gesehen, die sehr einfach schien, aber tatsächlich eine tiefe Bedeutung hat. Die Frage waren die Python-Ausdrücke i += x und i = Ist i + x äquivalent? Wenn Ihre Antwort „Ja“ ist, dann herzlichen Glückwunsch, Sie haben zu 50 % Recht. Warum sagen Sie, dass es nur zur Hälfte richtig ist? Nach unserem allgemeinen Verständnis gibt es keine Ähnlichkeiten oder Unterschiede zwischen den beiden, wenn es um Ganzzahloperationen geht. Gilt dies jedoch auch für Listenoperationen?
Schauen Sie sich zunächst die folgenden zwei Codeteile an:
Code 1
>>> l1 = range(3) >>> l2 = l1 >>> l2 += [3] >>> l1 [0, 1, 2, 3] >>> l2 [0, 1, 2, 3]
Code 2
>>> l1 = range(3) >>> l2 = l1 >>> l2 = l2 + [3] >>> l1 [0, 1, 2] >>> l2 [0, 1, 2, 3]
Der Wert von l2 in Code 1 und Code 2 ist derselbe, aber der Wert von l1 ist unterschiedlich, was darauf hinweist, dass i + = x und i = i + x ist nicht äquivalent. Unter welchen Umständen ist es also äquivalent und unter welchen Umständen ist es nicht äquivalent?
Bevor Sie dieses Problem klären, müssen Sie zunächst zwei Konzepte verstehen: veränderliche Objekte und unveränderliche Objekte.
Es gibt drei gemeinsame Attribute, die jedes Objekt in Python hat: eindeutiger Bezeichner, Typ und Wert.
Eindeutige Identifikation: wird verwendet, um die Einzigartigkeit eines Objekts im Speicher zu identifizieren. Es ändert sich nicht, nachdem das Objekt erstellt wurde. Die Funktion id() kann angezeigt werden Das Objekt. Der eindeutige Bezeichner vom Typ
bestimmt, welche Operationen das Objekt unterstützt. Beispielsweise kann eine Liste eine haben Längenattribut und Ganzzahlen nicht. Ebenso ändert sich der Typ eines Objekts nicht, sobald er bestimmt ist. Die Funktion type() kann die Typinformationen des Objekts zurückgeben. Der Wert eines Objekts unterscheidet sich von einem eindeutigen Bezeichner. Die Werte einiger Objekte können durch bestimmte Operationen geändert werden veränderliche Objekte. (veränderlich), Objekte, deren Werte nicht geändert werden können, werden unveränderliche Objekte (unveränderlich) genannt
Unveränderliche Objekte (unveränderlich)
Für unveränderliche Objekte gilt das Der Wert ist immer der Wert, als er zum ersten Mal erstellt wurde. Jede Operation am Objekt führt zur Erstellung eines neuen Objekts.
>>> a = 1 >>> id(a) 32574568 >>> a += 1 >>> id(a) 32574544
Veränderliches Objekt (veränderlich)
Der Wert eines veränderlichen Objekts kann durch bestimmte Operationen dynamisch geändert werden Beispielsweise kann ein Listenobjekt über die Append-Methode kontinuierlich Elemente zur Liste hinzufügen, und der Wert der Liste ändert sich ständig. Wenn ein Variablenobjekt zwei Variablen zugewiesen wird, teilen sie sich dasselbe Instanzobjekt und verweisen auf denselben Speicher. Adresse: Wenn eine der Variablen bearbeitet wird, wirkt sich dies auch auf die andere Variable aus.
>>> x = range(3) >>> y = x >>> id(x) 139726103041232 >>> id(y) 139726103041232 >>> x.append(3) >>> x [0, 1, 2, 3] >>> y [0, 1, 2, 3] >>> id(x) 139726103041232 >>> id(y) 139726103041232
Nachdem die Anhängeoperation ausgeführt wurde, ändert sich die Speicheradresse des Objekts nicht, x und y bleiben bestehen zeigen auf Es stellt sich heraus, dass es sich um dasselbe Objekt handelt, aber sein Wert hat sich geändert.
Nachdem wir veränderliche Objekte und unveränderliche Objekte verstanden haben, zurück zur Frage selbst: Was ist der Unterschied zwischen += und +?
__iadd__-Methode empfängt ebenfalls zwei Parameter, es handelt sich jedoch um eine direkte Operation, was bedeutet, dass sie den Wert des ersten Parameters ändert, da dies erfordert, dass das Objekt variabel ist Es gibt keine __iadd__-Methode für unveränderliche Objekte.
Integer-Objekte verfügen offensichtlich nicht über __iadd__, während Listenobjekte die Methode __iadd__ bereitstellen.
代码1中的 += 操作调用的是__iadd__方法,他会原地修改l2指向的那个对象本身的值
>>> l2 = l2 + [3] # 代码2:调用 __add__,创建了一个新的列表,赋值给了l2
而代码2中的 + 操作调用的是 __add__ 方法,该方法会返回一个新的对象,原来的对象保持不变,l1还是指向原来的对象,而l2已经指向一个新的对象。
以上就是表达式 i += x 与 i = i + x 的区别。因此对于列表进行 += 操作时,会存在潜在的bug,因为l1会因为l2的变化而发生改变,就像函数的参数不宜使用可变对象作为关键字参数一样。
更多详解Python中表达式i += x与i = i + x是否等价相关文章请关注PHP中文网!