2013-04-28 159 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工作得很好。

相关问题