为什么这在python中运行SOMETIMES? (可变范围)

时间:2014-01-14 11:32:20

标签: python python-2.7 scope

这不起作用:(未定义全局名称'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是矛盾的

2 个答案:

答案 0 :(得分:1)

在函数中创建变量时,如此

  def __init__(self):
    a = 3

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

为了使第三种情况起作用,将变量添加到当前对象(self),就像这样

  def __init__(self):
    self.a = 3

这只能用当前对象访问

  def f(self):
    print self.a

修改

关于第一个语句,如果你执行这样的if..elseprint语句,它可以正常工作

>>> 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