0
  1. 我不明白为什么,当 c=2 和 c=3 时,dict2['A']=1 和 dict2['A']=4 分别而不是 0,即使我使 dict2 等于 dict1,其中dict1 ['A'] = 0?为什么 dict1['A'] 从 0 变化?我不更改任何 dict1 变量!
  2. 为什么 dict3 在循环中显示正确的值,但只显示循环完成后最后一次迭代 3 的值。

非常感谢你。

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()
4

3 回答 3

3
  1. 这就是 Python 对象模型的工作原理。dict2 = dict1也就是说,在第一次循环迭代期间本质上发生的是原始 dict2 对象被丢弃,并且 dict2 现在引用与 dict 1 相同的底层对象。在随后的循环迭代中,该dict2 = dict1语句不起作用,因为dict1它们dict2都指向同一个底层对象。

  2. dict3 的打印语句是比循环体更远的缩进级别;它们不是循环的一部分,因此仅在循环完成后执行。

于 2013-09-04T04:54:01.047 回答
1
dict2 = dict1

这不会删除 的内容dict2并用dict1. 这使得名称dict1dict2引用相同的对象。你所做的任何事情都会dict2影响dict1,因为它们是同一件事。

如果你想要一个新的字典,请创建一个新的字典:

dict2 = collections.OrderedDict()

如果您想清除旧字典,请将其清除,但这可能不是您想要的:

dict2.clear()
于 2013-09-04T04:53:16.957 回答
1

当您分配时,您将dict2 = dict1以前存在的名称替换为空OrderedDict,并告诉解释器使用dict2来引用Object名称中存在的相同名称dict1。你可以做几件事来解决这个问题:

# copy
dict2 = dict1.copy()
# update dict 2
dict2.update(dict1.iteritems())
于 2013-09-04T04:55:48.293 回答