For List中的循环字典(Python 2.7.6)

2024-09-24 19:55:09 发布

您现在位置:Python中文网/ 问答频道 /正文

就我的一生而言,我不明白为什么会发生以下事情:

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循环,让它再附加两个字典,循环在第一个字典上运行良好,然后复制最后两个字典的值。我想这就是原因和解决办法,尽管我对这一点太陌生了,无法从问题中分辨出来。你知道吗

如果你能帮助我理解为什么会这样,我将不胜感激。你知道吗

谢谢


Tags: namenonenumberforlongest字典def事情
2条回答

造成混淆的原因是y.append(z)行。你知道吗

这不会附加字典z副本,而是另一个对z的相同实例的引用。你知道吗

因此,在循环的最后一次迭代中,当您修改刚刚附加的字典时,您也在修改上一次迭代中附加的第一个字典。你的列表y看起来就像[z, 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}]
>>> y[0]
{'fired': 0,
 'hits': 0,
 'longest streak': 0,
 'misses': 0,
 'name': 'none',
 'player': 2,
 'streak': 0}
>>> y[0] is y[1]
True
>>> y[0]['player'] = 123
>>> y[1]['player']
123

创建结构的一种更具python风格的方法是使用列表理解:

>>> def new_player(n, name="none"):
...     return {"player" : n, "name": name, "fired": 0, "hits": 0, "misses": 0, "streak": 0, "longest streak": 0}
... 
>>> y = [new_player(n) for n in range(2)]
>>> y
[{'fired': 0,
  'hits': 0,
  'longest streak': 0,
  'misses': 0,
  'name': 'none',
  'player': 0,
  'streak': 0},
 {'fired': 0,
  'hits': 0,
  'longest streak': 0,
  'misses': 0,
  'name': 'none',
  'player': 1,
  'streak': 0}]

正如其他人所指出的,你是在同一个词汇后面加上这个词

使用复制模块中的deepcopy。你知道吗

import copy

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(copy.deepcopy(z))
        y[i]["player"] = (i + 1)

number_player(x, y, z)
print y

相关问题 更多 >