我正在尝试自学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
可能有一个非常简单的答案,但为什么会这样呢?
答案 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可以正常工作。