为什么Python字典不能在此脚本中独立处理密钥?

hel*_*ndy 0 python dictionary key key-value python-2.6

我期待我的挫败感被一些启示所覆盖 - 这是一个用于演示问题的脚本的最小版本:

首先我创建一个字典:

dic  = {
    'foo':{}, 
    'bar':{}
    }
Run Code Online (Sandbox Code Playgroud)

然后我们实例化一个模板字典,可以迭代地附加到以下键dic:

appendic= {  
    'is':'',       #  '' is a terminal value to be replaced later
}
Run Code Online (Sandbox Code Playgroud)

所以这里我们附加appendic到以下每个键dic:

dic['foo'] = appendic
dic['bar'] = appendic
Run Code Online (Sandbox Code Playgroud)

现在我们用有意义的东西替换终端值'':

dic['foo']['is'] = 'foo'
dic['bar']['is'] = 'bar' 
Run Code Online (Sandbox Code Playgroud)

在这一点上,我的直觉告诉我,如果我们打电话:

print(dic['foo']['is']) 我们得到 'foo'

但是,相反,Python会回归'bar'到我没有训练的头脑,这是违反直觉的.

问题:

  • 如何告诉Python保持dic的密钥独立?
  • 为什么这是默认行为?这有什么用例?

Mar*_*ers 9

当您分配appendic两个不同的键时,Python不会复制.它改为指定引用.

其结果是,既dic['please_make_me_Foo']dic['dont_make_him_Bar']相同的对象.这些都不是独立的词典,它们都是同一个对象,一个appendic 引用.

如果您希望这些是单独的词典,请创建一个副本appendic.该dict.copy()方法创建字典的浅表副本:

dic['please_make_me_Foo']= appendic.copy()
dic['dont_make_him_Bar'] = appendic.copy()
Run Code Online (Sandbox Code Playgroud)

Shallow表示创建一个新字典,并复制对包含的键和值的所有引用.

如果appendic它本身包含也是字典的值,则不会复制这些值.新副本appendic都会引用相同的值.在大多数情况下,这不是问题,因为大多数原始值(字符串,整数等)是不可变的,并且在用新的值替换这些值时,您从未注意到共享引用.

  • @hello_there_andy:我们没想到你找到了傻瓜; 当你还不理解Python存储对象的引用时,行为可能很难搜索,当然.l4mpi指的是他觉得我应该更清楚并且发现你是一个骗子.:-) (3认同)
  • @ l4mpi:我很想找到合适的人.我们真的需要一个更通用的'halp我的字典/列表/集/自定义类正在共享'作为欺骗目标发布在某个地方. (2认同)