【问题标题】:Why is python dictionary attribute shared [duplicate]为什么python字典属性共享[重复]
【发布时间】:2018-07-03 05:53:22
【问题描述】:

我是 python 新手。当我在玩代码时,我发现了这个。

源代码:

dic = {}
mem_dic = {}

def set_op(ind, data):
    global dic, mem_dic
    key, value = data.split()
    dic[key] = int(value)
    mem_dic[ind] = dic
    print(ind, "====", mem_dic)

set_op(0, 'aaa 1')
set_op(1, 'bbb 2')

预期输出:

0===={0:{'aaa':1}}
1===={0:{'aaa':1},1:{'aaa':1,'bbb':1}}

实际输出:

0===={0:{'aaa':1,'bbb':1}}
1===={0:{'aaa':1,'bbb':1}}

谁能解释一下这种行为的原因。以及我应该进行哪些更改才能获得预期的输出。

【问题讨论】:

  • 你能解释一下你想在这里做什么吗?
  • @LutzHorn 在这里我试图在迭代期间跟踪字典中的变化
  • 请注意,您声明的实际输出与我在 python2.7 上运行时得到的实际输出不匹配;不确定这是否是编辑后更改内容的人工制品,但这对您的问题没有帮助。

标签: python dictionary


【解决方案1】:

拥有dic 的全局变量并不会带来任何好处。您的代码中有一个dic,您将它添加到mem_dic 两次。如果你想在mem_dic 中添加两个 dict,请不要将同一个dict 添加两次。

mem_dic = {}

def set_op(ind, data):
    global mem_dic
    key, value = data.split()
    dic = { key: int(value) } # a new dictionary
    mem_dic[ind] = dic
    print(ind, "====", mem_dic)
>>> set_op(0, 'aaa 1')
0 ==== {0: {'aaa': 1}}
>>> set_op(1, 'bbb 2')
1 ==== {0: {'aaa': 1}, 1: {'bbb': 2}}

【讨论】:

    【解决方案2】:

    通过更改此行创建字典的新实例 mem_dic[ind] = dict(dic)

    dic = {}
    mem_dic = {}
    
    def set_op(ind, data):
        global dic, mem_dic
        key, value = data.split()
        dic[key] = int(value)
        mem_dic[ind] = dict(dic)
        print(ind, "====", mem_dic)
    
    set_op(0, 'aaa 1')
    set_op(1, 'bbb 2')
    

    输出

    (1, '====', {0: {'aaa': 1}, 1: {'aaa': 1, 'bbb': 2}})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2015-07-09
      • 2017-04-29
      • 2015-07-10
      • 2017-12-30
      • 2018-11-11
      • 1970-01-01
      相关资源
      最近更新 更多