为什么Python字典不在这个脚本中独立地处理键呢?

2024-06-02 08:26:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望我的挫败感会被一些启示所掩盖-这里有一个脚本的最小版本来说明这个问题:

首先,我创建了一个字典:

dic  = {
    'foo':{}, 
    'bar':{}
    }

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

^{pr2}$

所以这里我们将appendic附加到dic中的每个键:

dic['foo'] = appendic
dic['bar'] = appendic

现在,我们用一些有意义的东西替换终端值“”:

dic['foo']['is'] = 'foo'
dic['bar']['is'] = 'bar' 

在这一点上,我的直觉告诉我,如果我们调用:

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

但是Python返回'bar'。。。对我没有受过训练的头脑来说这是违反直觉的。在

问题:

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

Tags: 实例版本脚本模板终端字典foois
3条回答
dic['please_make_me_Foo']= appendic
dic['dont_make_him_Bar'] = appendic

appendic是一个对象-您将对同一对象的引用分配给dic中的两个键。所以当你改变一个,你就改变了两个。在

试试这个:

^{pr2}$

你做了个口述:

appendic= {  
    'Python_made_me':''
}

把它加到你的另一个句子中两次

^{pr2}$

并设置单个dict的Python_made_me两次

dic['please_make_me_Foo']['Python_made_me'] = 'Foo'
dic['dont_make_him_Bar']['Python_made_me']  = 'Bar' 

但是因为它们是相同的dict,所以第二行覆盖了第一行

如果需要复制,则需要使用^{}方法:

dic['please_make_me_Foo']= appendic.copy()
dic['dont_make_him_Bar'] = appendic.copy()

当您将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()

Shallow意味着创建了一个新字典,所有对键和包含的值的引用都将被复制。在

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

相关问题 更多 >