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

作用域

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

Python中,函数的作用域是最低级的作用域,函数内部的变量只能在函数内部起作用。

python的四层作用域

  1. 局部作用域
  2. 闭包函数外的函数中
  3. 全局作用域
  4. 内建作用域

局部作用域

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