python字典共享列表append与=操作
Python中,当字典的值为可变对象(如列表)时,如果多个键引用同一个列表对象,修改其中一个键的值会影响其他键的值。这是因为它们共享同一个内存地址。
my_dict = {'k1': [], 'k2': []}
print(my_dict) # 输出: {'k1': [1], 'k2': []}
在这个例子中,k1 和 k2 的值是两个不同的列表,修改其中一个不会影响另一个。
my_dict = {'k1': value, 'k2': value}
print(my_dict) # 输出: {'k1': [1], 'k2': [1]}
这里 k1 和 k2 共享同一个列表,修改一个会影响另一个。
my_dict = {'k1': [], 'k2': []} # 每个键的值都是一个新的空列表
print(my_dict) # 输出: {'k1': [1], 'k2': []}
如果多个键需要独立的列表,确保为每个键分配一个新的列表对象。
若使用 append 和 = 赋值的行为是不同的。以下详细解释这两种情况:
append 是直接修改列表对象本身,因此如果多个键引用同一个列表对象,修改一个会影响所有引用它的键。
my_dict = {'k1': value, 'k2': value}
print(my_dict) # 输出: {'k1': [1], 'k2': [1]}
这里 k1 和 k2 的值是同一个列表对象,append 修改了共享的列表。
= 赋值是将一个新的对象绑定到键上,而不是修改原有对象。因此,使用 = 赋值不会影响其他键的值。
my_dict = {'k1': value, 'k2': value}
my_dict['k1'] = [1] # 将一个新的列表赋值给 'k1'
print(my_dict) # 输出: {'k1': [1], 'k2': []}
这里 k1 被赋予了一个新的列表 [1],而 k2 仍然引用原来的空列表。
append:直接修改列表对象本身(原地操作),所有引用该对象的变量都会看到修改。
=:将一个新的对象绑定到变量(或字典键),不会影响其他引用。
如果你希望每个键的值是独立的列表,可以在初始化时为每个键分配一个新的列表对象。
my_dict = {'k1': [], 'k2': []}
print(my_dict) # 输出: {'k1': [1], 'k2': []}
这里 k1 和 k2 的值是两个不同的列表对象,修改一个不会影响另一个。

浙公网安备 33010602011771号