python对象更改属性
我正在做一个坦克游戏,我有坦克和子弹。当我开火时,执行以下方法:python对象更改属性,python,list,oop,Python,List,Oop,我正在做一个坦克游戏,我有坦克和子弹。当我开火时,执行以下方法: def newshot(self,tank): shot = bullet() shot.loc = tank.loc shot.speed = tank.direction self.shots.append(shot) loc是显示位置[x,y]的列表,速度和方向是显示速度[dx,dy]的列表 为了移动每个子弹,速度向量被添加到for循环中的位置。但是每当我改变子弹的位置时,我的坦克的位置也会
def newshot(self,tank):
shot = bullet()
shot.loc = tank.loc
shot.speed = tank.direction
self.shots.append(shot)
loc是显示位置[x,y]的列表,速度和方向是显示速度[dx,dy]的列表
为了移动每个子弹,速度向量被添加到for循环中的位置。但是每当我改变子弹的位置时,我的坦克的位置也会改变(我在for循环前后打印了坦克的位置)。
我所做的是解决我的问题,而不是做
shot.loc = tank.loc
是的
我的问题是区别在哪里?当您使用:
shot.loc = tank.loc
shot.loc
和tank.loc
是对同一列表的引用
要复制列表,请使用:
shot.loc = tank.loc[:]
您复制了引用而不是值,这意味着两个变量指向同一个对象 发件人: Python中的赋值语句不复制对象,而是在目标和对象之间创建绑定。对于可变的或包含可变项的集合,有时需要一个副本,以便可以在不更改另一个副本的情况下更改一个副本 将
tank.loc
列表复制到shot.loc
的最简单方法是将整个列表切片:
shot.loc = tank.loc[:]
但请参阅以获取其他有效建议。您需要
deepcopy
列表。即:
import copy
shot.loc = copy.deepcopy(tank.loc)
以下是它的工作原理:
a = [[1, 2, 3], [4, 5, 6]]
b = a
a[0][1] = 10
print a
# [[1, 10, 3], [4, 5, 6]]
print b # b changes too -> Not a deepcopy.
# [[1, 10, 3], [4, 5, 6]]
import copy
b = copy.deepcopy(a)
a[0][1] = 9
print a
#[[1, 9, 3], [4, 5, 6]]
print b # b doesn't change -> Deep Copy
#[[1, 10, 3], [4, 5, 6]]
你是说坦克跟踪子弹?你是在另一个列表中添加对一个列表的引用。看起来您需要存储列表的副本。我解决了这个问题,但问题是shot.loc=tank.loc和shot.loc=[tank.loc[0],tank.loc[1]]之间的区别是什么?最佳解决方案,最佳描述!
a = [[1, 2, 3], [4, 5, 6]]
b = a
a[0][1] = 10
print a
# [[1, 10, 3], [4, 5, 6]]
print b # b changes too -> Not a deepcopy.
# [[1, 10, 3], [4, 5, 6]]
import copy
b = copy.deepcopy(a)
a[0][1] = 9
print a
#[[1, 9, 3], [4, 5, 6]]
print b # b doesn't change -> Deep Copy
#[[1, 10, 3], [4, 5, 6]]