2013-04-28 158 views
2

我試圖教自己Python,並且大部分都做得很好。然而,當我嘗試運行代碼Python錯誤:未定義全局名稱

class Equilateral(object): 
    angle = 60 
    def __init__(self): 
     self.angle1, self.angle2, self.angle3 = angle 

tri = Equilateral() 

我得到以下錯誤:

Traceback (most recent call last): 
    File "python", line 15, in <module> 
    File "python", line 13, in __init__ 
NameError: global name 'angle' is not defined 

有可能是一個非常簡單的答案,但爲什麼會出現這種情況?

回答

8
self.angle1, self.angle2, self.angle3 = angle 

應該

self.angle1 = self.angle2 = self.angle3 = self.angle 

只是說angle讓蟒蛇尋找一個全球angle變量不存在。您必須通過self變量引用它,或者因爲它是一個類級變量,所以也可以說Equilateral.angle

其他問題是用逗號分隔self.angleN s。當你以這種方式分配時,python會在等號的兩邊尋找相同數量的部分。例如:

a, b, c = 1, 2, 3 
4

您需要使用self.angle這裏,因爲類是本身的命名空間,以及訪問我們使用self.attr語法類內部的屬性,或者你也可以使用Equilateral.angle這裏angle是一個類變量太。

self.angle1, self.angle2, self.angle3 = self.angle 

這仍然是錯誤的監守你不能在一個值分配給三個變量:

self.angle1, self.angle2, self.angle3 = [self.angle]*3 

例子:

In [18]: x,y,z=1 #your version 
--------------------------------------------------------------------------- 

TypeError: 'int' object is not iterable 

#some correct ways: 

In [21]: x,y,z=1,1,1 #correct because number of values on both sides are equal 

In [22]: x,y,z=[1,1,1] # in case of an iterable it's length must be equal 
         # to the number elements on LHS 

In [23]: x,y,z=[1]*3 
1

雖然,B,C = d無效,a = b = c = d工作得很好。

相關問題