这不起作用:(未定义全局名称'a')
if True:
a = 3
else:
a = 4
print a
这有效:
class A:
def f(self):
if True:
a = 3
else:
a = 4
print a
A().f()
这不起作用:(未定义全局名称'a')
class A:
def __init__(self):
a = 3
def f(self):
print a
A().f()
为什么它在一个案例中而不在另一个案例中?我认为,如果它在case(2)中有用,那么因为a
进入类上下文,但这并不能使它在(3)中工作
我看到了其他讨论,但我不明白所说的一切,案件有所不同。
编辑:
示例1不起作用,至少在python 2.7解释器中是这样。这就是为什么示例1和2是矛盾的
答案 0 :(得分:1)
在函数中创建变量时,如此
def __init__(self):
a = 3
只能在该功能中访问它。这就是为什么1和2都在工作的原因。在第三种情况下,您在一个函数中创建一个局部变量,并尝试在另一个变量不可见的函数中访问它。这就是它失败的原因。
为了使第三种情况起作用,将变量添加到当前对象(self
),就像这样
def __init__(self):
self.a = 3
这只能用当前对象访问
def f(self):
print self.a
修改强>
关于第一个语句,如果你执行这样的if..else
和print
语句,它可以正常工作
>>> if True:
... a = 3
... else:
... a = 4
...
>>> print a
3
答案 1 :(得分:1)
在第三个示例中,a
是__init__
中的局部变量,并在该方法结束时被丢弃。在课程中,您需要使用self.a
来保持它:
class A:
def __init__(self):
self.a = 3
def f(self):
print self.a
您的其他示例实际上都有效,因为a
在本地定义并在同一范围内打印。要从我的解释器(2.7.3)复制粘贴示例1:
>>> if True:
a = 3
else:
a = 4
>>> print a
3