对象值与方法中指定的值不同

时间:2017-08-06 22:27:45

标签: python oop scope

我用一个围绕另一个点旋转的方法定义一个Point类:

def Rotate(self, origin, degrees):
    d = math.radians(degrees)
    O = origin
    sin = math.sin(d)
    cos = math.cos(d)
    print ("original "+self.ToString())
    self.x += -O.x
    self.y += -O.y
    print ("-origin "+self.ToString())
    WX = self.x * cos -self.y * sin
    WY = self.x * sin +self.y * cos
    self = Point(WX,WY)
    print ("-origin, after transform "+self.ToString())
    self.x += O.x
    self.y += O.y
    print ("End of method "+self.ToString())

然后我测试方法如下:

test = [Point(100,100),Point(110,110)]
test[0].Rotate(test[1],10)
print ("outside of method" + test[0].ToString())

打印命令的输出显示在方法结束时分配了所需的值,但随后更改了。

为什么会这样?

打印输出:

original 100 100
-origin -10 -10
-origin, after transform -8.111595753452777 -11.584559306791382
End of method 101.88840424654722 98.41544069320862
outside of method-10 -10

1 个答案:

答案 0 :(得分:0)

在你的功能中你写道:

self = Point(WX,WY)

然而,此方法之外无影响:现在您修改了本地变量self 。您无法以这种方式重新分配self。更改本地变量self后,您的self.x当然会指向新x的新Point(..)属性,但是您不会更改您调用该方法的对象。

但您可以做的是分配到字段

self.x, self.y = WX, WY

话虽如此,你可以把事情做得更紧凑:

def rotate(self, origin, degrees):
    d = math.radians(degrees)
    sin = math.sin(d)
    cos = math.cos(d)
    dx = self.x - origin.x
    dy = self.y - origin.y
    wx = dx * cos - dy * sin + origin.x
    wy = dx * sin + dy * cos + origin.y
    self.x = wx
    self.y = wy