就我的一生而言,我不明白为什么会发生以下事情:
x = 2
y = []
z = { "player" : 0, "name": "none", "fired": 0, "hits": 0, "misses": 0, "streak": 0, "longest streak": 0 }
def number_player(x, y, z):
for i in range(x):
y.append(z)
y[i]["player"] = (i + 1)
number_player(x, y, z)
print y
控制台返回:
[{'streak': 0, 'hits': 0, 'name': 'none', 'player': 2, 'misses': 0, 'longest streak': 0, 'fired': 0}, {'streak': 0, 'hits': 0, 'name': 'none', 'player': 2, 'misses': 0, 'longest streak': 0, 'fired': 0}]
简而言之,它创建了一个键/值对{…“player”:“2”。。。}两次。如果我在每个循环的末尾请求一个print,那么列表中第一个返回的字典将包含一个{…“player”:“1”…}键/值对。你知道吗
对我来说仍然陌生的是,如果我通过:
x = 3
y = [{ "player" : 0, "name": "none", "fired": 0, "hits": 0, "misses": 0, "streak": 0, "longest streak": 0 }]
然后运行for循环,让它再附加两个字典,循环在第一个字典上运行良好,然后复制最后两个字典的值。我想这就是原因和解决办法,尽管我对这一点太陌生了,无法从问题中分辨出来。你知道吗
如果你能帮助我理解为什么会这样,我将不胜感激。你知道吗
谢谢
造成混淆的原因是
y.append(z)
行。你知道吗这不会附加字典
z
的副本,而是另一个对z
的相同实例的引用。你知道吗因此,在循环的最后一次迭代中,当您修改刚刚附加的字典时,您也在修改上一次迭代中附加的第一个字典。你的列表
y
看起来就像[z, z]
。你知道吗创建结构的一种更具python风格的方法是使用列表理解:
正如其他人所指出的,你是在同一个词汇后面加上这个词
使用复制模块中的deepcopy。你知道吗
相关问题 更多 >
编程相关推荐