Python列表移动Turtle对象时出现多位置同步修改异常
问题原因
- Python中的自定义类实例(此处的
Turtle对象)属于可变引用类型,你执行turtles[i] = turtles[i-1]操作时,并没有创建新的海龟对象,只是将前一个位置的对象内存地址引用赋值给了后一个位置的列表元素。 - 循环执行完成后,
turtles[1]和turtles[0]存储的是同一个海龟对象的引用,本质上指向内存里的同一个实例。此时你修改turtles[0]的坐标,相当于修改了这个唯一实例的属性,所有指向该实例的变量(包括turtles[1])读取到的属性值自然会同步变化。 - 按照你的代码逻辑,循环结束后整个
turtles列表的4个元素最终都会指向最初索引0位置的那一个海龟对象,所有位置的坐标都会同步变动。
修复方案
你要实现的是「每个海龟的坐标更新为前一个海龟的旧坐标」,不需要改动列表内的对象引用,直接修改每个对象的x坐标属性即可:
# 把原来的赋值引用的循环替换成如下代码 for i in range(len(turtles)-1, 0, -1): print(f"Element in position {i} with xcor {turtles[i].xcor()} will have the xcor {turtles[i-1].xcor()}") # 直接修改坐标属性,不替换对象引用 turtles[i].setx(turtles[i-1].xcor()) turtles[0].forward(20)
修改后索引1的坐标就会是你预期的0,只有索引0的坐标更新为20。
内容的提问来源于stack exchange,提问作者d2907
相关产品推荐
相关产品推荐

