python陷阱 – 变量作用域

这个程序会输出什么?

1
2
3
4
5
6
7
8
9
a = 1
def test_func():
  print a
  a = 2
  print a
 
print a
test_func()
print a

正确的答案是,test_func的第一个print会触发异常,这是因为python著名的"Global Unless Assigned"规则。
因为在test_func中有"a=2"这样的语句,这会导致test_func中a被作为局部变量,所以在执行第一个print a时会出错(此时尚未赋值)。解决方法是在 test_func 中加入global a这样的声明,声明甚至可以放在第一个print之后,但会导致一个告警,所以通常的写法都是写在a的引用之前,象这样:

1
2
3
4
5
def test_func():
  global a
  print a
  a = 2
  print a

Leave a comment

Your comment