python 变量和作用域

发布时间:2018-02-25 18:20:34编辑:admin阅读(3203)

    变量作用域

    python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。


    变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。python的作用域一共有4种,分别是:


    L (Local) 局部作用域

    E (Enclosing) 闭包函数外的函数中

    G (Global) 全局作用域

    B (Built-in) 内建作用域


    L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。


    x = int(2.9)  # 内建作用域
    g_count = 0  # 全局作用域
    def outer():
        o_count = 1  # 闭包函数外的函数中
        def inner():
            i_count = 2  # 局部作用域


    举个例子

    name = "Li Si"
    def change_name(name):
        print("before change:", name)
        #局部变量,这个函数就是这个变量的作用域
        name = "Zhang San"
        print("after change", name)
    
    change_name(name)
    print(name)

    执行输出

    before change: Li Si

    after change Zhang San

    Li Si


    最后一行打印的name,并没有改变。


    局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就会出错

    例如:

    name = "Li Si"
    def change_name(name):
        print("before change:", name)
        #局部变量,这个函数就是这个变量的作用域
        name = "Zhang San"
        print("after change", name)
        age = 23
    
    change_name(name)
    print(age)

    执行报错

    NameError: name 'age' is not defined


    全局变量

    在程序的一开始定义的变量称为全局变量。

    因为代码是从上往下执行的,所以全局变量,必须在程序的头部位置。


    举个例子

    #全局变量
    city = "beijing"
    def change_name(name):
        city = "shanghai"
        print("before change:", name,city)
        #局部变量,这个函数就是这个变量的作用域
        name = "Zhang San"
        print("after change", name)
    
    name = "Li Si"
    change_name(name)
    print(name)
    print(city)

    执行输出

    before change: Li Si shanghai

    after change Zhang San

    Li Si

    beijing


    全局与局部变量


    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

    全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

    当全局变量与局部变量同名时:

    在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。


    上面的例子中,city变量没有受到局部变量的影响。


    如果函数内部,一定要改全局变量呢?需要用global关键字声明才可以

    #全局变量
    city = "beijing"
    def change_name(name):
        global city
        city = "shanghai"
        print("before change:", name,city)
        #局部变量,这个函数就是这个变量的作用域
        name = "Zhang San"
        print("after change", name)
    
    name = "Li Si"
    change_name(name)
    print(name)
    print(city)

    执行输出

    before change: Li Si shanghai

    after change Zhang San

    Li Si

    shanghai


    另外一种全局变量写法,不推荐这么做

    def change_name():
        global name
        name = "wang"
    
    change_name()
    print(name)

    执行输出 wang


    为什么不推荐这么做?因为只有当函数执行的时候,定义的全局变量才会改变。否则不会生效。

    这种写法,要被骂街的。


    函数内部修改列表

    city = "beijing"
    names = ["jack","rose","tom"]
    def change_name():
        names[0] = "frank"
        print("inside",names)
    
    change_name()
    print("outside",names)

    执行输出

    inside ['frank', 'rose', 'tom']

    outside ['frank', 'rose', 'tom']


    为什么都一样呢?

    只有字符串,整数这种类型时,不能在函数内部更改全局变量。

    稍微复杂一点的,比如列表,字典,集合,类,都是可以在函数内部更改的。

关键字

上一篇: python 函数

下一篇: python 递归与高阶函数