Jak*_*key 5 python dictionary mutable immutability python-3.x
我是 python 新手,刚刚学习不可变和可变对象(由于我在 MATLAB 和 C# 方面的编码经验有限,我以前从未遇到过这种情况)。
我想知道为什么,如果 python 中的字典是可变的,那么编辑第二个字典中包含的字典不会更改第二个字典吗?
这是一个示例,其中将字典(蝙蝠侠)添加到超级英雄名称字典(super_hero_names)中。当蝙蝠侠后来被更改时,它不会反映在超级英雄名称字典中。如果字典像字符串一样不可变,这对我来说是有意义的,但它们是可变的,那么为什么会发生这种情况呢?
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'}
Run Code Online (Sandbox Code Playgroud)
您代码中的问题是字符串是不可变的:您无法将字符串修改'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'}
Run Code Online (Sandbox Code Playgroud)
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"}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13052 次 |
| 最近记录: |