Python 为什么使用zip启动的元组键的字典会在更新单个键时更新所有键?

Python 为什么使用zip启动的元组键的字典会在更新单个键时更新所有键?,python,dictionary,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: [

我刚过了一个难关。此代码的作用与您预期的一样:

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']}

有人知道这里发生了什么吗?我想我也会把这篇文章发布给任何可能通过它的人。

字典中的每个值都指向同一个列表,因为
[[]]*len(keys)
。这意味着“创建一个列表,并将引用复制到它的
len(keys)
次”

没有什么神秘之处。通过将
[[]]
len(键)
相乘,您已经创建了一个列表,所有列表都指向同一个对象。请参阅,以获得更清晰的答案。我明白了。因此
len(键)
指针将指向同一个列表。我以为它只是制作了不同的列表!