Python字典赋值给列表后为何出现5个重复元素?
问题解析:为何列表中全是相同元素?
首先纠正一个小细节:你的代码运行后,mylist里会有6个(而非5个)完全相同的元素,输出结果为:
[{'x': 5, 'y': 10}, {'x': 5, 'y': 10}, {'x': 5, 'y': 10}, {'x': 5, 'y': 10}, {'x': 5, 'y': 10}, {'x': 5, 'y': 10}]
核心原因:可变对象的引用传递
在Python中,字典属于可变对象,变量名本质是对内存中对象的引用。你的代码逻辑存在以下关键问题:
- 一开始创建的
o = {'x':0, 'y':0}是一个字典对象,o只是指向这个对象的"指针"。 - 循环里的
m = o并没有复制新字典,只是让m也指向同一个字典对象。 - 每次修改
m['x']和m['y'],都是直接修改内存中那同一个字典的内容。 mylist.append(m)添加的是这个字典的引用,而非字典本身,所以列表里的6个元素其实都是指向同一个字典的指针。
当循环结束时,这个字典最后一次被修改为{'x':5, 'y':10},因此列表里所有元素显示的都是这个最终状态。
解决方法:每次循环创建独立字典
要得到预期的不同元素,需在每次循环中生成新的字典对象,常见两种方式:
- 直接在循环内创建新字典:
mylist=[] for i in range(6): m = {'x': i, 'y': i*2} mylist.append(m) print(mylist)
- 复制原字典的浅拷贝(适合结构简单的字典):
o = {'x':0, 'y':0} mylist=[] for i in range(6): m = o.copy() # 等价于 dict(o) m['x'] = i m['y'] = i*2 mylist.append(m) print(mylist)
两种方式都会生成独立的字典对象,最终列表会输出[{'x':0,'y':0}, {'x':1,'y':2}, ..., {'x':5,'y':10}]的预期结果。
内容的提问来源于stack exchange,提问作者victor
相关产品推荐
相关产品推荐

