python中的作用域

参考链接: http://python.jobbole.com/86465/

块间的作用域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> if 1 ==1:
... name = 'peter'
...
>>> print(name)
peter
>>> if i in range(10):
... age = 1
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined
>>> if i in range(10):
... age = i
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined
>>> for i in range(10):
... age = i
...
>>> print(age)
9

局部作用域

1
2
3
4
5
6
7
8
9
10
>>> name = 'zhangsan'
>>> def f1():
... name = 'lisi'
... def f2():
... name = 'wangwu'
... print(name)
... f2()
...
>>> f1()
wangwu

学过函数,肯定知道最后f1()执行完会输出wangwu;我们先记住一个概念,Python==中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错==。


终极版作用域

1
2
3
4
5
6
7
8
9
10
11
>>> name = 'peter'
>>> def f1():
... print(name)
...
>>> def f2():
... name = 'eric'
... return f1
...
>>> ret = f2()
>>> ret()
peter

分析代码,这里执行ret()函数其实就是执行了函数f1(),因为函数f2()最后返回调用f1(),f1()和f2()并没有什么关系,调用f1()在f1()的作用域里寻找name。

1
2
3
4
5
6
7
8
9
10
11
>>> li = [lambda:x for x in range(10)]
>>> li
[<function <listcomp>.<lambda> at 0x7fb196ec0bf8>, <function <listcomp>.<lambda> at 0x7fb196ec0c80>, <function <listcomp>.<lambda> at 0x7fb196ec0d08>, <function <listcomp>.<lambda> at 0x7fb196ec0d90>, <function <listcomp>.<lambda> at 0x7fb196ec0e18>, <function <listcomp>.<lambda> at 0x7fb196ec0ea0>, <function <listcomp>.<lambda> at 0x7fb196ec0f28>, <function <listcomp>.<lambda> at 0x7fb196ebe048>, <function <listcomp>.<lambda> at 0x7fb196ebe0d0>, <function <listcomp>.<lambda> at 0x7fb196ebe158>]
>>> type(li)
<class 'list'>
>>> type(li[0])
<class 'function'>
>>> print(li[0])
<function <listcomp>.<lambda> at 0x7fb196ec0bf8>
>>> print(li[0]())
9