Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python对象更改属性_Python_List_Oop - Fatal编程技术网

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]]