为何Python中del操作会同时修改原字典response与新列表x?
为什么修改列表x时字典response也会同步变化?
这是因为Python中可变对象的引用传递机制导致的:
- 列表属于可变对象,当你执行
x.append(my_dict['input_1'])时,并没有把input_1对应的列表复制一份放进x,而是把这个列表的引用地址存到了x里。也就是说,x里的元素和response里的input_1、input_2指向的是同一个内存中的列表对象。 - 后续执行
del x[i][0:2]时,本质是通过引用直接修改了内存中的原列表对象,所以response里对应的列表自然会同步发生变化。
解决方法:创建列表副本
如果只想修改x而不影响原response,需要在添加到x时创建列表的副本,切断和原对象的引用关联。常见的方式有:
- 使用列表的
copy()方法 - 使用切片
[:]创建副本 - 用
list()构造函数生成新列表
修改后的x构建代码如下:
x = [] for my_dict in response['result']: # 创建input_1的副本,避免引用原对象 x.append(my_dict['input_1'].copy()) # 创建input_2的副本 x.append(my_dict['input_2'].copy())
如果你的列表存在多层嵌套(比如示例中的二维列表),需要完全独立的副本时,要使用深拷贝copy.deepcopy():
import copy x = [] for my_dict in response['result']: x.append(copy.deepcopy(my_dict['input_1'])) x.append(copy.deepcopy(my_dict['input_2']))
内容的提问来源于stack exchange,提问作者dr23
相关产品推荐
相关产品推荐

