10 Stimmen

Kopiert Python bei der Instanziierung eines Objekts einen Wert oder eine Referenz?

Eine einfache Frage, vielleicht, aber ich kann meine Google-Anfrage nicht so formulieren, dass ich die Antwort hier finde. Ich habe die Angewohnheit, Kopien von Objekten zu erstellen, wenn ich sie an Objektkonstruktoren übergebe, etwa so:

...
def __init__(self, name):
    self._name = name[:]
...

Wenn ich jedoch den folgenden Testcode ausführe, scheint es nicht notwendig zu sein, dass Python bei der Objektinstanziierung tiefe Kopien der Objektwerte erstellt:

>>> class Candy(object):
...     def __init__(self, flavor):
...             self.flavor = flavor
...
>>> flav = "cherry"
>>> a = Candy(flav)
>>> a
<__main__.Candy object at 0x00CA4670>
>>> a.flavor
'cherry'
>>> flav += ' and grape'
>>> flav
'cherry and grape'
>>> a.flavor
'cherry'

Worum geht es hier wirklich? Danke!

EDITAR:

Danke an @Olivier für seine tolle Antwort. Der folgende Code dokumentiert ein besseres Beispiel dafür, dass Python per Referenz kopiert:

>>> flav = ['a','b']
>>> a = Candy(flav)
>>> a.flavor
['a', 'b']
>>> flav[1] = 'c'
>>> flav
['a', 'c']
>>> a.flavor
['a', 'c']

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X