块级作用域??
if 1 == 1: name = "lzl" print(name) for i in range(10): age = i print(age) lzl9
java中是不可以执行成功的但是在python中可以执行成功,,这是因为在Python中是没有块级作用域的,代码块里的变量,外部可以调用,所以可运行成功;
函数局部作用域
def func(): name = "zxt" print(name) name 'name' is not defined
name变量只在func()函数内部中生效,所以在全局中是没法调用的;
作用域误区
name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2() lzl
我们都知道,Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错
类似于下面的规则
#作用域链 name = "lzl"def f1(): name = "Eric" def f2(): name = "Snor" print(name) f2() f1()
我们再看一个代码
name = "lzl" def f1(): print(name) def f2(): name = "eric" return f1 ret = f2() ret() lzl
f2()执行结果为函数f1的内存地址,即ret=f1;执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系.
静态作用域
i = 1def g(): a = i a = a + 3 print(i,a) g()1
发现i可以找到全局变量
但是
i = 1def g(): i = i + 1 a = a + 3 print(i,a) g() local variable 'i' referenced before assignment
无法找到全局的i,原因是Python是静态作用域(词法作用域),因此在编译阶段,就决定了变量的读取方式。
作者:张晓天a
链接:https://www.jianshu.com/p/20ff1f180762