python能够改变变量作用域的代码段是def、class、lamda. ( 模块,类以及函数才会引入新的作用域 )
if/elif/else、try/except/finally、for/while 并不能涉及变量作用域的更改,也就是说他们的代码块中的变量,在外部也是可以访问的
变量搜索路径是:本地变量->全局变量
注意以下例子,跟js很像:
i = 0 def f(): print i i = 0f()
运行结果显示:UnboundLocalError: local variable 'i' referenced before assignment。
因为在函数 f() 中出现了变量 i=0,编译器会认为i属于局部变量(local),根据LEGB规则,先搜索local变量,则在 print i 语句时候,局部变量 i 还没有赋值,故抛出异常。
i = 0def f(): i += 1 print if()
以上同样会报错,i += 1 等价于 i = i + 1,因为 x= 是一个定义变量的行为,则 i + 1 中的 i 实际上市未定义的