哪些网站可以接点私活做的,网站建设视频代码,深圳定制家具厂,中国工业设计在线官网Python是静态作用域#xff0c;也就是说在Python中#xff0c;变量的作用域源于它在代码中的位置。与C语言有一些类似#xff0c;与C语言比起来还有一些需要注意的地方。 现在的Python支持4种作用域#xff0c;LEGB L(local)#xff1a;局部作用域#xff1b…Python是静态作用域也就是说在Python中变量的作用域源于它在代码中的位置。与C语言有一些类似与C语言比起来还有一些需要注意的地方。 现在的Python支持4种作用域LEGB L(local)局部作用域E(Enclosing): 闭包函数外的函数中G(Global):全局作用域B(Build-in):內建作用域在Python中只有模块、类和函数会引入新的作用域其他代码是不会引入新的作用域的 看下列C代码和Python代码 // C code
#include stdio.h
int main(){if(20)int i 0printf(i %d, i);return
} # Python code
if True:i 0
print(i) 上述代码中C代码编译会失败而Python代码将成功运行。在上述Python代码中if语句并没有引入一个新的作用域变量i存在于全局作用域中所以变量i对于接下来的print语句将是可见的。 在Python中使用一个变量之前不需要先对其进行声明但真正使用它之前这个变量必须被绑定到某个对象上而且名字绑定将在当前作用域中引入新变量同时屏蔽外层作用域的同名变量不论这个名字绑定发生在当前作用域中的哪个位置。(下面代码 code3会体现) # code 1
def f():print(i)
f()
# 运行结果 NameError: global name i is not defined # code 2
i 0
def f():i 8print(i)
f()
print i
# 运行结果 8 和 0 # code 3
i 0
def f():print(i)i 0
f()# 运行结果 UnboundLocalError: local variable i referenced before assignment # code 4
print(i)
i 0
# 运行结果 NameError: name i is not defined Python查找变量按照L-E-G-B的顺序的规则查找在code 1中在函数作用域中和全局作用域找不到i变量所以报出global name not define由于函数作用域会屏蔽全局作用域所以输出结果是8 和 0 而不是 8 和 8code 3中显示的是UNboundLocalError (这是什么鬼_)另外code 4中无论是以交互方式运行还是脚本方式运行都是显示NameError。综合这两个错误我们可以总结如下的结论。对函数体而言Python在运行之前会对代码进行预处理因此无论名称绑定发生在作用域的哪个地方它都能感知出来并且屏蔽全局作用域但是对象绑定却是动态发生的所以在code3处出现的是UNboundLocalError, 因为运行到 print(i)时 变量i仍未绑定到实际对象上。但是对于顶级作用域(模块作用域)却没有做任何预处理所以出现的是name i is not defined的错误。转载于:https://www.cnblogs.com/pluviophile/p/7441711.html