2

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

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

4

3 回答 3

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

应该

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

只是说angle让python寻找一个angle不存在的全局变量。你必须通过self变量来引用它,或者因为它是一个类级别的变量,你也可以说Equilateral.angle

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

a, b, c = 1, 2, 3
于 2013-04-28T00:11:35.790 回答
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
于 2013-04-28T00:11:55.567 回答
0

虽然 a, b, c = d 无效,但 a = b = c = d 工作得很好。

于 2013-12-08T17:24:46.237 回答