可能重複:
「Least Astonishment」 in Python: The Mutable Default Argument
dictionary shared between objects for no reason?Python對象列表,每個對象都有自己的數組字典。附加到一個附加到所有
class Player():
zones = {}
def __init__(self):
self.zones['hand'] = []
def InitHand(self):
for a in range(5):
self.zones['hand'].append(a)
lst = []
lst.append(Player())
lst.append(Player())
lst[0].InitHand()
print lst[1].zones['hand']
此打印 「[0,1,2,3,4]」,但我只初始化了第0個元素... 將它們更改爲數組可以解決問題,但對於我的生活,我無法弄清楚爲什麼會發生這種情況。
class Player2():
zones = []
def __init__(self):
self.zones = []
def InitHand(self):
for a in range(5):
self.zones.append(a)
lst = []
lst.append(Player2())
lst.append(Player2())
lst[0].InitHand()
print lst[1].zones
這打印 「[]」 預期
相關/欺騙:Python中「最小驚訝」:易變的默認參數(http://stackoverflow.com/q/1132941) –
@MartijnPieters我看不出在這個任何可變默認參數題。 –
@MarkRansom:這就是我說'相關'的原因。原理相同,在這種情況下,mutable屬性在實例之間共享,而不是函數調用。 –