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

15 浏览
0 Comments

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

这个问题已经有答案了:

如何复制一个字典且只编辑复制品

我期望我的沮丧可以被一些启迪所取代 - 这是演示问题的脚本的最小版本:

首先我创建了一个字典:

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

然后我们实例化一个可以逐个附加到dic键上的模板字典:

appendic= {  
    'is':'',       #  '' is a terminal value to be replaced later
}

所以我们在所有的键中附加appendic

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

现在我们将终端值,空字符串,替换为有意义的值:

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

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

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

但是Python返回\'bar\'…对于我的非专业人士来说,这是违反直觉的。

问题:

  • 我如何告诉Python保持dic的键是独立的?
  • 为什么这是默认行为?它有哪些用例?
admin 更改状态以发布 2023年5月25日
0
0 Comments

你创建了一个字典:

appendic= {  
    'Python_made_me':''
}

将其添加到你的另一个字典中两次

dic['please_make_me_Foo']= appendic
dic['dont_make_him_Bar'] = appendic

并将单个字典的Python_made_me值设置两次

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

但由于它们是同一个字典,第二行将覆盖第一行

如果你需要复制它,你需要使用copy方法:

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

0
0 Comments

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

浅拷贝意味着创建一个新的字典,并将所有对包含的键和值的引用复制到新的字典中。

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

0