1
def foo(i):
  print len(A)
  return i < len(A)

if __name__ == '__main__':
  A = [12]
  print A 
  foo(10)

怎么可能foo知道A

我写这个是因为 stackoverflow 坚持要我写更多的字。

4

3 回答 3

5

检查生成的字节码:

>>> dis.dis(foo)
  2           0 LOAD_GLOBAL              0 (print) 
              3 LOAD_GLOBAL              1 (len) 
              6 LOAD_GLOBAL              2 (A) 
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair) 
             12 CALL_FUNCTION            1 (1 positional, 0 keyword pair) 
             15 POP_TOP              

  3          16 LOAD_FAST                0 (i) 
             19 LOAD_GLOBAL              1 (len) 
             22 LOAD_GLOBAL              2 (A) 
             25 CALL_FUNCTION            1 (1 positional, 0 keyword pair) 
             28 COMPARE_OP               0 (<) 
             31 RETURN_VALUE

要加载A变量,它使用LOAD_GLOBAL操作码。因此,当函数运行时(而不是在定义时),它将在全局命名空间中搜索这个变量

于 2013-10-16T21:40:28.573 回答
4

A是一个全局变量。您可能会认为它是if __name__ == '__main__'块的本地对象,但if 语句不会在 Python 中创建单独的命名空间。当foo执行(未定义)时,变量A存在于全局命名空间中,因此您当前的代码运行没有任何问题。

如果您想查看您的预期行为将所有内容从该块移动到一个函数中,然后从该if __name__ == '__main__'块中调用它:

def foo(i):
  print len(A)      # A is local to main(), so this will raise an exception
  return i < len(A)

def main():
  A = [12]
  print A 
  foo(10)

if __name__ == '__main__':
  main()
于 2013-10-16T21:43:07.797 回答
2

因为 A 是在全局范围内定义的,并且在调用之前不会在函数中查找。

是一样的原因

def should_fail():
   print undefined_variable

print "runs OK!"

运行正常。

于 2013-10-16T21:40:59.957 回答