我正在编写模拟用于研究群体和避障场景中的无人机交互的模拟。我目前的问题是让车辆更新他们的位置。基本上,我有一个基类,它包含update()方法,该方法进行计算以获得新的位置和速度。 sim代码中的实际对象是其子类的实例,在子类的update()方法中,我所做的只是更新加速度向量并调用super()。update()。但是,函数调用后会保留这些值。我认为这只是我对Python缺乏了解,因为我刚开始使用它(来自C ++多年)。我所做的搜索通过引用传递给我的信息很好,但到目前为止我无法得到这个具体问题的答案。这是代码:
[编辑]根据jonrsharpe的要求,我写了一个最小的例子,它封装了我遇到的问题。这是最小的代码:
class UpdateTester:
x = [0,0]
def update(self):
for elem in self.x:
elem += 1
class SubClassTester(UpdateTester):
def update(self):
super(SubClassTester,self).update()
a = SubClassTester()
for i in range(1,5):
a.update()
print(a.x)
所以基本上,根据我的(无可否认有限的)理解,我应该得到一个输出,显示列表a.x的增量。但是,运行此示例的输出显示重复的[0,0]为输出。
答案 0 :(得分:1)
整数在Python中是不可变的,因此for elem in self.x: elem += 1
nothing 。它不会改变self.x
。如果您想更改self.x
:
for i, value in enumerate(self.x):
self.x[i] = value + 1
UpdateTester.x
也是一个类变量。所有实例都是一样的。列表在Python中是可变的,因此如果您在.update()
类的任何实例上调用UpdateTester
,那么您可以更改所有这些列表的列表。要改为创建每个实例列表,请将其放在__init__()
:
class UpdateTester(object):
def __init__(self, **kwargs):
super(UpdateTester, self).__init__(**kwargs) # for multiple inheritence
self.x = []