我发现了一些(对我来说)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
实例之间存在一些不需要的连接。任何人都不知道吗?