Ich habe ein Verhalten, das von dem, was ich gehört habe, in Python ist üblich, aber ich würde gerne wissen, das ist die Standardeinstellung, und wie dies zu verhindern. Betrachten Sie den folgenden Code ein:Python ändern außerhalb Wörterbuch von innen Funktion
dic1 = {'a':1, 'b':2}
lis1 = [1, 2]
def somefunc(dic):
dic.update({'b':20})
return dic
def otherfunc(lis):
lis.append(20)
return lis
for i in range(3):
dic2 = dic1
lis2 = lis1
print(dic2)
somefunc(dic2)
print(lis2)
otherfunc(lis2)
Wir ich diesen Code ausführen, gibt sie
{'a': 1, 'b': 2}
[1, 2]
{'a': 1, 'b': 20}
[1, 2, 20]
{'a': 1, 'b': 20}
[1, 2, 20, 20]
aber warum es nicht geben das folgende?
{'a': 1, 'b': 2}
[1, 2]
{'a': 1, 'b': 2}
[1, 2]
{'a': 1, 'b': 2}
[1, 2]
Ich fühle es ausgeben sollte dies, da ich dic2
und lis2
bin zurückzusetzen. Warum ist das das Standardverhalten? Sollte Python keine Kopie von dic2
erstellen, sobald es die Funktion eingibt? Sollte nicht dic2=dic1
eine Kopie von dic1
erstellen, anstatt einen anderen Zeiger auf den gleichen Ort im Speicher zu erstellen? (Wenn das in der Tat, was passiert)
ich dieses Verhalten von dem Auftreten mit dic1
durch Ersetzen dic2 = dic1
mit dic2 = dic1.copy()
(oder dem Hinzufügen von dic=dic.copy()
auf die Funktion) verhindern kann, aber wie mache ich es mit Listen? Sie haben keine Kopiermethode. Gibt es eine Möglichkeit für mich, dies standardmäßig zu verhindern, ohne daran zu denken, die Kopiermethode jedes Mal zu verwenden, wenn ich innerhalb einer Funktion Wörterbücher (oder vielleicht sogar Pandas-Datenrahmen usw.) behandle?
Prost
Alle Werte in Python werden als Referenz übergeben. Siehe http://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference für eine ausführlichere Erklärung. – jstlaurent