为什么这在python中运行SOMETIMES?

why does this works SOMETIMES in python ? (variable scope)

本问题已经有最佳答案,请猛点这里访问。

这不起作用:(未定义全局名称"a")。

1
2
3
4
5
if True:
  a = 3
else:
  a = 4
print a

这工作:

1
2
3
4
5
6
7
8
9
class A:
  def f(self):
    if True:
      a = 3
    else:
      a = 4
    print a

A().f()

这不起作用:(未定义全局名称"a")。

1
2
3
4
5
6
7
class A:
  def __init__(self):
    a = 3
  def f(self):
    print a

A().f()

为什么它在一种情况下有效而在另一种情况下无效?我认为如果它在案例(2)中起作用,那是因为a进入了类上下文,但这并不能使它在(3)中起作用。我看到了其他的讨论,但我不理解所说的每一件事,情况也有点不一样。

编辑:

示例1不起作用,至少在Python2.7解释器中不起作用。这就是为什么示例1和2是矛盾的。


在第三个例子中,a__init__中的一个局部变量,当该方法结束时会被丢弃。在类中,您需要使用self.a来保持它:

1
2
3
4
5
class A:
  def __init__(self):
    self.a = 3
  def f(self):
    print self.a

您的其他示例实际上都有效,因为在两个a中,都是在本地定义并在同一范围内打印的。从我的解释器(2.7.3)复制粘贴示例1:

1
2
3
4
5
6
7
8
>>> if True:
    a = 3
else:
    a = 4


>>> print a
3


当您在函数中创建变量时,如下所示

1
2
  def __init__(self):
    a = 3

它只能在该函数中访问。这就是为什么1和2都有效。在第三种情况下,您在一个函数中创建一个局部变量,并尝试在另一个变量不可见的函数中访问它。这就是它失败的原因。

为了使第三种情况正常工作,请将变量添加到当前对象(self中),如下所示

1
2
  def __init__(self):
    self.a = 3

这只能用当前对象访问

1
2
  def f(self):
    print self.a

编辑:

对于第一个语句,如果您执行这样的if..elseprint语句,它会很好地工作。

1
2
3
4
5
6
7
>>> if True:
...     a = 3
... else:
...     a = 4
...
>>> print a
3