有些时间点错过一次,就好比错过了一生。

作用域

作用域:在作用域的内部可以访问这个变量,但是在外部没办法访问这个作用域里面的变量。

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函数,其实就是和案例二一样的作用。