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

2024-04-24 13:04:52 发布

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

我是python新手,正在学习不可变和可变的对象(我以前在MATLAB和C的有限编程经验中从未遇到过这种情况)。在

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

下面是一个例子,在这个例子中,一个dict(蝙蝠侠)被添加到一个关于超级英雄名字的dict中。当蝙蝠侠后来被改变时,它并没有反映在超级英雄的名字dict中。如果dicts像字符串一样是不可变的,这对我来说是有意义的,但是它们是可变的,那么为什么会发生这种情况呢?在

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'}

Tags: names情况名字dict例子superclarkhero
3条回答

每次创建字典batman,实际上是在创建一个字典并将其分配给变量batman

我相信你想做的是:

super_hero_names = {
    'Superman' : 'Clark Kent',
    'Spiderman' : 'Peter Parker'}
batman = {'Batman' : 'Bruce'}
super_hero_names.update(batman)
super_hero_names['Batman'] =  'Bruce Wayne'
print(super_hero_names)

在这种情况下,输出将是:

^{pr2}$

可变名称

代码中的问题是字符串是不可变的:不能将字符串'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中工作,只需很少的修改:

^{pr2}$

您可以通过将名称存储在列表中来实现您想要的结果,但是由于额外的间接层,这会使代码更加混乱和效率低下。在

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

batman = {'Batman' : ['Bruce']}
super_hero_names.update(batman)

batman['Batman'][0] = 'Bruce Wayne'
print(super_hero_names)

输出

^{pr2}$

我们也可以使用

batman['Batman'][0] += ' Wayne'

相关问题 更多 >