[英]python dictionary weird behavior
非常感谢你。
import collections
def main():
dict1 = collections.OrderedDict()
dict2 = collections.OrderedDict()
dict3 = collections.OrderedDict()
dict1['A'] = 0
dict1['B'] = 0
dict1['C'] = 0
for c in [1, 2, 3]:
print('c=' + str(c))
dict2 = dict1
print('dict1A=' + str(dict1['A']))
print('dict2A=' + str(dict2['A']))
if c == 1:
dict2['A'] = 1
dict2['B'] = 2
dict2['C'] = 3
elif c ==2:
dict2['A'] = 4
dict2['B'] = 5
dict2['C'] = 6
elif c ==3:
dict2['A'] = 7
dict2['B'] = 8
dict2['C'] = 9
dict3['c' + str(c)] = dict2
print('dict2A=' + str(dict2['A']))
print('dict' + str(c) + 'A=' + str(dict3['c' + str(c)]['A']))
print('dict' + str(c) + 'B=' + str(dict3['c' + str(c)]['B']))
print('dict' + str(c) + 'C=' + str(dict3['c' + str(c)]['C']))
print('dict3-c1A='+ str(dict3['c1']['A']))
print('dict3-c2B=' + str(dict3['c2']['B']))
print('dict3-c3C=' + str(dict3['c3']['C']))
if __name__ == '__main__':
main()
输出:
c=1
dict1A=0
dict2A=0
dict2A=1
dict1A=1
dict1B=2
dict1C=3
c=2
dict1A=1
dict2A=1
dict2A=4
dict2A=4
dict2B=5
dict2C=6
c=3
dict1A=4
dict2A=4
dict2A=7
dict3A=7
dict3B=8
dict3C=9
dict3-c1A=7
dict3-c2B=8
dict3-c3C=9
*编辑*非常感谢您的回答。 我不知道字典的'='操作与变量的不同。 我发现并按照gddc的建议,copy()是我想要的:
dict2 = dict1.copy()
这就是Python对象模型的工作方式。 通过说dict2 = dict1
,本质上在第一次循环迭代期间发生的事情是原始dict2对象被丢弃,而dict2现在引用与dict 1相同的基础对象 。 在随后的循环迭代中, dict2 = dict1
语句无效,因为dict1
和dict2
已经都指向相同的基础对象。
您对dict3的打印语句比循环主体更深一层。 它们不是循环的一部分,因此仅在循环完成后才执行。
dict2 = dict1
这不删除的内容dict2
与内容填充它dict1
。 这使得名称dict1
和dict2
指向同一对象。 您对dict2
任何事情dict2
影响dict1
,因为它们是同一件事。
如果您想要一个新的字典,请做一个新的字典:
dict2 = collections.OrderedDict()
如果要清除旧字典,请清除它,但这可能不是您想要的:
dict2.clear()
当您分配dict2 = dict1
,替换以前作为空OrderedDict
存在的名称,并告诉解释器改用dict2
引用名称dict1
中存在的同一Object
。 您可以做一些事情来解决此问题:
# copy
dict2 = dict1.copy()
# update dict 2
dict2.update(dict1.iteritems())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.