2016-05-30 13 views
2

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

+0

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

Antwort

1

auf Python, Listen sind wandelbar, bedeutet dies, dass LIS2 nur ein anderer Name für LIS1 ist, so dass sie das gleiche Objekt

hier gibt 2 Möglichkeiten sind eine Kopie LIS1 auf LIS2 zu machen:

lis2 = lis1[:] 

lis2 = list(lis1) 

würde ich mit list() bevorzugen, da es besser lesbar ist.

Verwandte Themen