标签:
内容目录:
python中无块级作用域
if 1 == 1: name = ‘jabe‘ print(name) #可以正常输出jabe #在python中无块级作用域 #在c#或者java中是不能这样使用的,提示name未定义的
python中以函数为作用域
def func(): name = ‘jbae‘ func() print(name) #会提示name为定义的报错,说明在python中以函数为作用域的
python作用域链由内想外找,直到找不到报错
name = ‘jabe‘ def f1(): # name = ‘a‘ def f2(): # name = ‘b‘ print(name) f2() f1() #输出 jabe
函数执行前,作用域(链)已经确定
name = ‘jabe‘ def f1(): print(name) def f2(): name = ‘ljb‘ f1() f2() 输出: jabe #=============================== name = ‘jabe‘ def f1(): print(name) def f2(): name = ‘ljb‘ return f1 ret = f2() ret() 输出: jabe
lambda函数作用域
li = [lambda :x for x in range(10)] r = li[0]() print(r) print(‘===================‘) #输出为9,上面的例子等同于下面的代码 li = [] for i in range(10): def f1(): return i li.append(f1)
#li 为列表,内部的元素为相同功能的函数
print(li[0]()) print(li[1]()) print(li[2]()) print(li[3]()) #输出: # 9 # =================== # 9 # 9 # 9 # 9
由于函数为被调用时是未被执行的,所以当循环结束时i为9,最后调用时候显示均为9
上面的函数我们稍作更改就可以打印的不为9了
li = [] for i in range(10): def f1(x=i): return x li.append(f1) #li 为列表,内部的元素为相同功能的函数 print(li[0]()) print(li[1]()) print(li[2]()) print(li[3]()) #输出: # 0 # 1 # 2 # 3
上面的例子中因为每次执行循环,将i值赋给x,因此打印的为0,1,2,3
我们从以前学过的知识中可以知道,python3.5类的多重继承顺序为从左到右,由下到上的顺序来继承寻找的。
在python2.7中,如果为新式类和py3.5中是寻找的顺序是一样的,但是经典类的继承顺序稍有不同,一直深层寻找,直到找到为止,不会向右边寻找。
不继承object是经典类,继承object是新式类 (和py3中一致)
python运维开发(十)----IO多路复用多线程、进程、协程
标签:
原文地址:http://www.cnblogs.com/Jabe/p/5659212.html