【问题标题】:why does initialize a dictionary of lists using fromkeys affect how the list appends [duplicate]为什么使用fromkeys初始化列表字典会影响列表的附加方式[重复]
【发布时间】:2017-09-16 07:15:33
【问题描述】:

使用不同的方法创建列表的字典

d1 = {'foo':[],'bar':[]}
d2 = dict.fromkeys(['foo','bar'],[])

产生两个相同的字典。

print(d1==d2,d1,d2)

True {'foo': [], 'bar': []} {'foo': [], 'bar': []}

但是,将值附加到列表中

d1['foo'].append('a')
d2['foo'].append('a')

d1['foo'].append(2)
d2['foo'].append(2)

产生两个不同的字典。为什么 dict 的初始化方法会影响列表追加行为?

print(d1==d2,d1,d2)

False {'foo': ['a', 2], 'bar': []} {'foo': ['a', 2], 'bar': ['a', 2]}

在 fromkeys 之后,python 也将 list append 语句应用于所有其他键。

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    当您使用fromkeys 时,正在发生的事情是正在创建字典,并且它的所有键都具有与其值相同的对象。

    这意味着d2["foo"]d2["bar"] 都引用同一个对象。它是 same 对象,而不仅仅是一个 相同 对象。因此,通过一个键修改它会更改所有其他键。

    如果您使用自定义对象,这一点会更加明显:

    class MyClass:
        def __init__(self):
            pass
    
    a = MyClass()
    d = dict.fromkeys(["foo", "bar"], a)
    

    打印d 会产生以下输出:

    {'foo': <__main__.MyClass object at 0x0000000004699AC8>, 'bar': <__main__.MyClass object at 0x0000000004699AC8>}
    

    注意内存地址是一样的,因为它是同一个对象。

    但是,在d1 中,您不会将相同的对象分配给两个键。相反,您分配了两个单独的相同(空列表)。因此,修改一个不会改变另一个。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2016-02-14
      • 2021-08-21
      • 1970-01-01
      • 2012-07-20
      • 2013-12-30
      • 1970-01-01
      • 2012-09-29
      • 2012-11-07
      相关资源
      最近更新 更多