有些时间点错过一次,就好比错过了一生。
作用域
作用域:在作用域的内部可以访问这个变量,但是在外部没办法访问这个作用域里面的变量。
Python中,函数的作用域是最低级的作用域,函数内部的变量只能在函数内部起作用。
python的四层作用域
- 局部作用域
- 闭包函数外的函数中
- 全局作用域
- 内建作用域
局部作用域
def fun():
i=0
i就是这个函数内部的变量,只能在这个函数中使用。
闭包函数中的作用域
def outer():
out_var=1
# 闭包函数外的函数
def inner():
inner_var=2
# 局部作用域
全局作用域
global_var=0
全局变量。
内建作用域
x=int(2.8)
print x
x本身是一个全局变量,通过调用内置函数int()来实现。
需要注意的是,程序代码执行的时候,寻找变量是按照局部作用域–>闭包函数外的函数中–>全局作用域–>内建作用域的顺序一步一步的来寻找变量,只要记住顺序,然后依次推导即可。
可以在函数内部(局部作用域)声明全局变量,使用global和nonlocal来申明。global是声明全局变量,如果在局部要对全局变量修改,需要在局部也要先声明该全局变量。nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
案例一
a=1
def outer(a):
print 'first:'+str(a)
a=2
print 'secend:'+str(a)
def inner():
global a
print 'third:' +str(a)
inner()
outer(a)
运行结果:
first:1
secend:2
third:1
案例二
name='xiaotaohong'
def f1():
print name
def f2():
name = 'langzi'
f1()
f2()
运行结果:
xiaotaohong
原因:虽然说在f2函数中调用了f1,但是严格意义上来说并没有形成一个闭包函数,所以按照之前说到四个顺序来说,在函数的作用域取决于函数代码块在整体函数中的位置,而不是调用的时机。就是说f1函数首先在本地找局部变量,如果没找到就去外部找全局变量。
如果想要让f1函数输出langzi怎么办呢?使用函数传参,使其得到的参数来自f1函数外部的变量。
name='xiaotaohong'
def f1(name):
print name
def f2():
name='langzi'
f1(name)
f2()
运行结果:
langzi
案例三
name = 'xiaotaohong'
def f2():
name = 'langzi'
return f1
def f1():
print name
ret=f2()
ret()
运行结果:
xiaotaohong
原因:ret其实就是f2函数,f2返回对象是f1函数,其实就是和案例二一样的作用。