【python之路40】Python 作用域
python的作用域与javaScript是一样的,参考:http://www.cnblogs.com/sunshuhai/p/9112578.html
一、python是以函数作为作用域的
if 1==1: xo = 123 print(xo) #输出:123
xo = "alex" def f1(): print(xo) def f2(): xo = "xxoo" f1() f2() #输出:alex
二、python函数是有内层向外查找的
li=[] for i in range(10): def f1(): return i li.append(f1) print(li) #输出列表,列表内包含10个函数 print(li[0]()) #输出:9, #为什么输出9呢? #1、执行完for循环函数只是写入内存并没有被执行 #2、此时f1函数外部变量i的值为9,函数执行时首先去函数内部找i,找不到时则逐层向外查找
以上代码换为lambda表达式结果是一样的:
li=[] for i in range(10): f1=lambda :i li.append(f1) print(li) #输出列表,列表内包含10个函数 print(li[0]()) #输出:9,
可以继续简化:
li=[] for i in range(10): li.append(lambda:i) print(li) #输出列表,列表内包含10个函数 print(li[0]()) #输出:9,
三、支持列表特殊操作语法
python支持列表特殊操作,如下面代码:
li = [x for x in range(10)] print(li) #结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
开头的X可以支持表达式运算:
li = [x+10 for x in range(10)] print(li) #结果:[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
还可以支持条件语句:
li = [x+10 for x in range(10) if x > 5] print(li) #结果:[[16, 17, 18, 19]] #循环x,判断x的值是否大于5,如果大于5则+10
那么再看下面的代码:
li = [lambda: x for x in range(10)] print(li) #结果是:列表内存放着10个函数 print(li[0]()) #结果是:9 #循环每x,并返回lambda:x