为何修改Python字典列表中的字典时列表也会改变?
Python中可变与不可变对象的引用差异问题
代码示例1:字典修改影响列表内容
>>> y = [] >>> x = {'num':1} >>> y.append(x) >>> x['num']=2 >>> x['new_num']=3 >>> y [{'num': 2, 'new_num': 3}]
问题
为何修改x时y也会发生变化?Python中的其他操作是否也存在这种逻辑?
对比示例:数值修改不影响列表内容
>>> y = [] >>> x = 1 >>> y.append(x) >>> x += 1 >>> y [1]
解答
核心原因是Python对可变对象和不可变对象的处理逻辑不同:
- 字典(
dict)属于可变对象,执行y.append(x)时,列表y中存储的是指向字典x的内存引用,而非字典的副本。后续修改x指向的字典内容时,列表里的引用指向的仍是同一个字典,因此y的内容会同步变化。 - 整数(
int)属于不可变对象,执行x += 1时,并非修改原有整数1,而是创建了新的整数2并让x指向它。列表y中存储的是原有整数1的引用,因此y的内容不会改变。
Python中常见的可变对象还有:列表(list)、集合(set)、自定义类实例;不可变对象还有:字符串(str)、元组(tuple)、浮点数(float)。所有涉及可变对象的引用传递场景,都会出现类似逻辑,比如:
>>> a = [1, 2] >>> b = [a, 3] >>> a.append(4) >>> b [[1, 2, 4], 3]
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

