在Python字典中追加数组将追加到所有数组中。

12 浏览
0 Comments

在Python字典中追加数组将追加到所有数组中。

我有以下代码:

a_dict = dict.fromkeys(['a', 'b', 'c'], [])  
a_dict['a'].append(1)  
print(a_dict)  

它的输出结果是

`{'a': [1], 'c': [1], 'b': [1]}` 

为什么1被添加到了所有的数组中,而不仅仅是键为a的数组?如果我只想将其添加到键为a的数组中,该怎么做?

0
0 Comments

问题的出现原因是当使用fromkeys()方法创建一个新的字典时,如果提供的值参数是可变对象(值可以被修改的对象)如列表、字典等,当修改可变对象时,序列的每个元素也会被更新。这是因为每个元素被分配了对同一个对象的引用(指向内存中的同一个对象)。

解决方法是使用copy()方法来创建一个新的可变对象,以避免修改原始对象时影响到序列的每个元素。这样每个元素将被分配一个对不同对象的引用,从而避免了更新所有元素的问题。

以下是更多关于此问题的说明和代码示例:

在Python中,当使用fromkeys()方法创建一个新的字典时,如果提供的值参数是可变对象,如列表或字典,当修改这个可变对象时,所有元素都会被更新。这是因为每个元素被分配了对同一个对象的引用,因此任何对该对象的修改都会影响到所有元素。

为了解决这个问题,我们可以使用copy()方法来创建一个新的可变对象,从而避免修改原始对象时影响到序列的每个元素。这样每个元素将被分配一个对不同对象的引用,从而避免了更新所有元素的问题。

下面是一个示例代码:

# 创建一个新的字典,并将所有元素的值初始化为一个空列表
d = dict.fromkeys(['a', 'b', 'c'], [])
# 修改第一个元素的值
d['a'].append(1)
# 输出字典的值
print(d)

输出结果将是:

{'a': [1], 'b': [1], 'c': [1]}

可以看到,修改一个元素的值导致所有元素的值都被更新为相同的值。这是因为所有元素引用同一个列表对象。

为了避免这个问题,我们可以使用copy()方法创建一个新的可变对象,如下所示:

# 创建一个新的字典,并将所有元素的值初始化为一个空列表的副本
d = dict.fromkeys(['a', 'b', 'c'], [].copy())
# 修改第一个元素的值
d['a'].append(1)
# 输出字典的值
print(d)

输出结果将是:

{'a': [1], 'b': [], 'c': []}

现在,只有第一个元素的值被更新,其他元素的值保持不变。这是因为每个元素引用一个不同的列表对象的副本。

通过使用copy()方法,我们可以避免在修改一个元素的值时影响到其他元素。这对于创建具有不同默认值的字典非常有用。

0
0 Comments

问题的出现原因:

在创建字典时,使用了dict.fromkeys()方法,并将一个空列表[]作为默认值。这导致字典中的每个键都指向同一个值,即同一个空列表[]的实例。因此,修改其中一个键对应的值会影响到其他键对应的值。

解决方法:

要解决这个问题,可以使用循环来创建字典,并为每个键分别赋予一个新的空列表实例。这样每个键都将指向不同的空列表,相互之间不会产生影响。

下面是解决问题的代码示例:

a_dict = {}
keys = ['a', 'b', 'c']
for key in keys:
    a_dict[key] = []

通过以上方式创建的字典,每个键都指向一个独立的空列表实例,互不影响。这样就解决了原问题。

最终总结:

在Python字典中,当使用相同的可变对象作为默认值时,可能会导致所有键共享同一个对象的问题。为了避免这种情况,可以使用循环创建字典,并为每个键分配一个新的实例,以确保每个键都指向不同的对象。

0
0 Comments

在Python中,使用dict.fromkeys()方法初始化字典时,如果将一个可变对象(如列表)作为默认值,字典中的所有值都将指向同一个对象。这意味着对其中一个值进行修改会影响到其他所有值。

解决这个问题的方法是,可以使用字典推导式来初始化字典,确保每个键都有一个独立的列表对象。例如,可以使用以下代码来初始化字典:

yet_another_dict = {key: [] for key in ['a', 'b', 'c']}

这样,每个键都有一个独立的空列表作为值,对其中一个列表进行修改不会影响其他列表。

参考链接:

[dict.fromkeys all point to same list](https://stackoverflow.com/questions/15516413)

0