为什么带有元组密钥的字典会在更新单个密钥时更新所有密钥?

时间:2016-04-28 22:57:05

标签: python dictionary

我刚刚被骗了。此代码的行为与您期望的一样:

keys = range(8)

DICT={}
for k in keys:
    DICT[k] = []
print DICT
#returns
#{0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []}

DICT[1].append('mkay')
print DICT
#returns
#{0: [], 1: ['mkay'], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []}

但如果我以不同方式初始化字典,则追加行为完全不同:

DICT = dict(zip(keys,[[]]*len(keys)))
print DICT
#returns
#{0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []}

所以它看起来一样。但事实并非如此:

DICT[1].append('mkay')
print DICT
#returns
#{0: ['mkay'], 1: ['mkay'], 2: ['mkay'], 3: ['mkay'], 4: ['mkay'], 5: ['mkay'], 6: ['mkay'], 7: ['mkay']}

有谁知道这里发生了什么?我以为我会把这个发布给其他可能得到它的人。

1 个答案:

答案 0 :(得分:1)

由于[[]]*len(keys),字典中的每个值都引用相同的列表。这表示“创建一个列表,并将其引用复制到len(keys)次”。