Python类实例变量或默认参数的行为不符合预期

时间:2018-03-12 10:13:21

标签: python memory-management pytest instance-variables

我发现了一些(对我来说)python 3.6的奇怪行为。我使用pytest来测试我定义的Vehicle类的一些行为。我创建了一个类的实例并用三个向量初始化它,即 position velocity acceleration ,略微改变这些向量然后创建同一个类的第二个实例,并使用稍微不同的向量对其进行初始化,明确定义一个并依赖__init__()方法中提供的默认值。但是,在初始化之后,似乎python不使用构造函数的默认值,而是使用第一个实例的最后一个值。

以下是我用来测试我的实现的代码:

def test_vehicle_movement():
  vehicle = Vehicle2d(velocity=Vector(1.0, 0.0))
  assert vehicle.velocity == Vector(1.0, 0.0)
  assert vehicle.position == Vector(0.0, 0.0)
  vehicle.move()
  assert vehicle.position == Vector(1.0, 0.0)
  vehicle2 = Vehicle2d(acceleration=Vector(2.0, 0.0))
  assert vehicle2.position == Vector(0.0, 0.0)   # fails

这是vehicle类的构造函数:

class Vehicle2d:
  def __init__(self, position: Vector = Vector(0.0, 0.0), 
               velocity: Vector = Vector(0.0, 0.0),
               acceleration: Vector = Vector(0.0, 0.0)):
    self.position = position
    self.velocity = velocity
    self.acceleration = acceleration

  def move(self):
    # changes the velocity and position vectors according to acceleration

我在另一个线程上找到this answer,但在我的情况下,使用了不同的内存地址,这就是为什么我期望在类与实例变量区域中出现一些错误。但是,对python来说还是个新手,我不明白我做错了什么。更糟糕的是: velocity 向量按预期正确重置,只有位置很麻烦。此外,如果我明确地将vehicle2位置定义为零向量,则可以正常工作。出于某种原因,我得出结论,默认参数未正确使用,或者我的vehicle实例之间存在一些不需要的连接。任何人都不知道吗?

0 个答案:

没有答案