Ich schrieb 2 einfache Codes in Python, die das gleiche funktionieren sollte, aber es tut nicht. Wenn Sie mir sagen können, warum ist das, und erklären Sie mir auch mehr über die "alles ist ein Objekt in Python". Dank :)Warum gibt es Unterschiede zwischen diesen beiden Codes?
def f(p=[]):
print p
f.a += 1
print id(p)
if(f.a == 1):
p = p + [4]
else:
p = p + [5]
return p
f.a = 0
f()
f()
f()
Antwort:
[] 40564496 [] 40564496 [] 40564496
def f(p=[]):
print p
f.a += 1
print id(p)
if(f.a == 1):
p += [4]
else:
p +=[5]
return p
#print f()
#print f()
f.a = 0
f()
f()
f()
Antwort:
[] 40892176 [4] 40892176 [4, 5] 40892176
wie Sie sehen - der erste Code jedes Mal eine neue Liste, und die zweite zu der zuletzt verwendeten ...
Es ist nicht so, dass Sie veränderbare Objekte als Standardwerte ** niemals ** weitergeben sollten, sondern Sie sollten verstehen, was es bedeutet. –
@juanpa - sicher, es gibt immer eine Ausnahme (siehe aktualisierte Antwort). – lejlot
Ich würde nicht sagen, "* vererbe niemals [a] veränderbare Objekte als Standardwerte." Es gibt bestimmte Fälle, in denen ein solches Verhalten erwünscht und nützlich ist (d. H. Einen Memoisierungsdekorator schreiben). – pzp