2017-08-06 106 views
0

分配不同予定義與方法的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

分配'自我=點(WX, WY)'。而self是一個* local *變量。 –

+0

我建議你查看[數據模型](https://docs.python.org/3/reference/datamodel.html) - 'ToString'使它看起來像你正在寫Java([Python不是](http://dirtsimple.org/2004/12/python-is-not-java.html))。你能給工人上一堂[mcve]嗎? – jonrsharpe

回答

0

在你的函數你寫:

self = Point(WX,WY) 

然而,這有沒有影響方法之外:現在你有修改當地變量self。您不能以這種方式重新分配self。你已經改變了當地變量self,你self.x當然會點的新Point(..)x屬性後,但你不會有改變在其上調用該方法的對象。

什麼,但是你可以做的是分配到田間地頭

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 
相關問題