块级作用域??
if 1 == 1:
name = "lzl"
print(name)
for i in range(10):
age = i
print(age)
lzl
9
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 = 1
def g():
a = i
a = a + 3
print(i,a)
g()
1
发现i可以找到全局变量
但是
i = 1
def g():
i = i + 1
a = a + 3
print(i,a)
g()
local variable 'i' referenced before assignment
无法找到全局的i,原因是Python是静态作用域(词法作用域),因此在编译阶段,就决定了变量的读取方式。