python - 如果 python 中的字典是可变的,为什么编辑第二个字典中包含的字典不会更改第二个字典?

标签 python python-3.x dictionary immutability mutable

我是 Python 的新手,刚刚开始学习不可变对象(immutable对象)和可变对象(由于我在 MATLAB 和 C# 中的编码经验有限,我以前从未遇到过这种情况)。

我想知道,如果 python 中的字典是可变的,为什么编辑第二个字典中包含的字典不会更改第二个字典?

这是一个示例,其中将字典 (batman) 添加到 super 英雄名称 (super_hero_names) 的字典中。当 bat 侠后来被改变时,它并没有反射(reflect)在 super 英雄的名字字典中。如果字典像字符串一样不可变,这对我来说是有意义的,但它们是可变的,那么为什么会发生这种情况?

super_hero_names = {
    'Superman' : 'Clark Kent',
    'Spiderman' : 'Peter Parker'
}

batman = {'Batman' : 'Bruce'}

super_hero_names.update(batman)

batman['Batman'] = 'Bruce Wayne' # (edited)

print(super_hero_names)

# Output: {'Superman': 'Clark Kent', 'Spiderman': 'Peter Parker', 'Batman': 'Bruce'}

最佳答案

可变名称

您的代码中的问题是字符串是不可变的:您不能将字符串 'Bruce' 修改为 'Bruce Wayne'。你更换它,引用就消失了。如果使用可变对象作为值,则可以达到预期的效果:

class Person:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return repr(self.name)


super_hero_names = {
    'Superman': Person('Clark Kent'),
    'Spiderman': Person('Peter Parker')
}

bruce = Person('Bruce')
batman = {'Batman': bruce}

super_hero_names.update(batman)

bruce.name = 'Bruce Wayne'

print(super_hero_names)
# {'Superman': 'Clark Kent', 'Spiderman': 'Peter Parker', 'Batman': 'Bruce Wayne'}

你在 Ruby 中的例子

Ruby 和 Python 通常具有非常相似的语法。 Ruby 字符串是可变的,因此您的代码只需很少的修改即可在 Ruby 中运行:

super_hero_names = {
    'Superman' => 'Clark Kent',
    'Spiderman' => 'Peter Parker'
}

batman = {'Batman' => 'Bruce'}

super_hero_names.update(batman)

batman['Batman'] << ' Wayne' # Mutates the string, doesn't replace it!

print(super_hero_names)
# {"Superman"=>"Clark Kent", "Spiderman"=>"Peter Parker", "Batman"=>"Bruce Wayne"}

关于python - 如果 python 中的字典是可变的,为什么编辑第二个字典中包含的字典不会更改第二个字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47737470/

相关文章:

python - Wagtail API - 如何公开片段

python - 使用 NumPy 高效返回带有小数分量的插入点索引

python - 软件包的 pip 安装可以从源代码安装,但从软件包安装失败

java - 如何使用 java lambda 获取子元素以放入 Map<Long, List<Long>>?

python - 如何在随机点云上拟合点网格

python - 为什么我的 openpyxl WorkBook.active() 给我一个 TypeError : Object is not callable?

python - 有没有办法在Python中从右到左累加?

python - 从 C 结构创建 PyBuffer

C# 在静态字典中存储值

c++ STL map迭代器输出十六进制值