为什么 Python 字典在这个脚本中不能独立处理键?
为什么 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日
你创建了一个字典:
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'
但由于它们是同一个字典,第二行将覆盖第一行
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()
浅拷贝意味着创建一个新的字典,并将所有对包含的键和值的引用复制到新的字典中。
如果appendic
本身含有值也是字典,则不会被复制。新副本和appendic
都将引用相同的值。在大多数情况下,这不是问题,因为大多数基本值(字符串、整数等)都是不可变的,并且您永远不会注意到引用共享,因为您将这些值替换为新值。