Python蛇游戏中追加列表后更新原列表致所有记录同步变化的原因
问题原因
你遇到的问题本质是Python中可变对象的引用机制。列表是可变对象,当你执行my_list.append(var1)时,并没有把var1的数值复制一份存进列表,而是把var1这个列表对象的引用添加到了my_list里。所以后续修改var1的元素时,列表里所有指向这个引用的条目都会跟着变化,最终所有元素都显示成最后一次修改后的结果。
解决方案
有几种简单的方法可以解决这个问题:
方法1:每次循环创建新的列表对象
在循环内重新定义坐标列表,而不是修改同一个列表:
my_list = [] run = True i = 0 while run and i <= 10: i += 1 var1 = [5 + (i-1), 50 - (i-1)] # 每次生成新的列表 my_list.append(var1) print(my_list)
方法2:使用列表的拷贝方法
如果需要保留原有的变量修改逻辑,可以在append时添加var1的副本,而不是原引用。可以用list.copy()方法或者切片var1[:]:
my_list = [] run = True var1 = [5, 50] i = 0 while run and i <= 10: i += 1 my_list.append(var1.copy()) # 或者 my_list.append(var1[:]) var1[0] += 1 var1[1] -= 1 print(my_list)
方法3:使用元组(如果坐标不需要后续修改)
元组是不可变对象,如果你不需要在循环外修改坐标,可以用元组存储:
my_list = [] run = True var1 = (5, 50) i = 0 while run and i <= 10: i += 1 my_list.append(var1) var1 = (var1[0] + 1, var1[1] - 1) # 生成新的元组 print(my_list)
运行以上任意一种代码,都会得到预期的结果:列表里的每个元素都是不同的坐标值,而不是全部指向最后一次修改的列表。
内容的提问来源于stack exchange,提问作者ZonicTrout
相关产品推荐
相关产品推荐

