Python错误:未定义全局名称

时间:2013-04-28 00:09:49

标签: python class

我正在尝试自学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

可能有一个非常简单的答案,但为什么会这样呢?

3 个答案:

答案 0 :(得分:8)

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

应该是

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

只是说angle使python查找不存在的全局angle变量。您必须通过self变量引用它,或者因为它是类级变量,您还可以说Equilateral.angle

其他问题是您的逗号分隔self.angleN。当你以这种方式分配时,python将在等号的两边寻找相同数量的部分。例如:

a, b, c = 1, 2, 3

答案 1 :(得分: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

答案 2 :(得分:0)

虽然a,b,c = d无效,但a = b = c = d可以正常工作。

相关问题