【发布时间】:2016-06-04 20:33:53
【问题描述】:
我目睹了以下 Python 代码 sn-p 的一种非常奇怪的行为。
list_of_dict = [{}]*2 # create a list of 2 dict
list_of_dict[0]["add_to_dict_0"] = 1 # add a (key,val) pair to 1st dict
print list_of_dict[0]
print list_of_dict[1]
输出是:
{'add_to_dict_0': 1}
{'add_to_dict_0': 1}
虽然我(明确地)只更新了一本,但两本词典都已更新。但是,将第 1 行中的初始化更改为以下内容:
list_of_dict = [dict() for _ in xrange(0,2)]
解决了这个问题。
这种行为的原因是什么?我猜这是 Python 中 name-object binding 概念的产物(与 C/C++ 等其他语言中的变量内存位置绑定相反)。我的猜测是,在第一种情况下,list_of_dict[0] 和 list_of_dict[1] 都绑定到同一个字典对象。
我的怀疑正确吗?如果是,那么为什么在第二种情况下没有复制行为? dict_object = dict()和dict_object = {}有什么区别?
【问题讨论】:
-
list_of_dict = [dict() for _ in xrange(0,2)]和list_of_dict = [{} for _ in xrange(0,2)]都有效。您的问题实际上与dict()与{}无关。
标签: python variables dictionary reference