Python中list的append方法是复制对象还是创建引用?
Python循环中字典append的引用问题
先看你给出的代码:
simple_list = ['a', 'b', 'c'] dict_list = [] for x in simple_list: local_dict = {'key': x} dict_list.append(local_dict) print(dict_list)
直接给结论:调用append时添加的是字典的引用,但因为你每次循环都用local_dict = {'key': x}创建了一个全新的字典对象,所以dict_list里的每个元素都是独立的字典,不会出现后续修改影响之前元素的情况。
你的原理解是错的:
- 首先,Python里的
append从来不会自动复制对象,它只会把对象的引用添加到列表里。 - 其次,Python的for循环不会为循环体创建单独的作用域,循环内的变量
local_dict在循环结束后并不会“超出作用域”消失,它会一直存在直到所在的更大作用域结束。
但为什么你的代码结果是对的?因为每次循环里的{'key': x}都会生成一个新的字典对象,local_dict每次都被重新赋值,指向这个新对象。所以你append到列表里的引用,每个都指向不同的字典,最终输出的[{'key': 'a'}, {'key': 'b'}, {'key': 'c'}]是正确的。
举个反例你就明白差别了:如果把字典创建移到循环外面,循环内只修改字典的值,那append的就都是同一个字典的引用,最终列表里的所有元素都会是最后一次修改后的结果:
simple_list = ['a', 'b', 'c'] dict_list = [] local_dict = {} # 只创建一次字典 for x in simple_list: local_dict['key'] = x dict_list.append(local_dict) print(dict_list) # 输出: [{'key': 'c'}, {'key': 'c'}, {'key': 'c'}]
内容的提问来源于stack exchange,提问作者Karthick
相关产品推荐
相关产品推荐

