python笔记-变量的作用域

一、python变量的作用域

python中, 所有变量并不是在哪个位置都可以访问的。访问权限取决于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称

  1. 全局变量: 定义在函数外部的变量
    • 在函数内部, 可以访问全局变量, 不能进行修改
  2. 局部变量: 定义在函数内部的变量
    • 只能在函数内部访问, 在函数外部不能访问
num = 0  # 全局变量

def sum(arg1, arg2):
    # 返回两个参数的和
    num = arg1 + arg2  # num在这里是局部变量
    print('局部变量:', num)
    return num

sum(10, 5)
print('全局变量:', num)

python中的4种作用域
按照从上到下依次对变量进行搜索

  1. 局部作用域
  2. 嵌套的父级函数的局部作用域(闭包外层函数作用域)
  3. 全局作用域
  4. 内建作用域

二、python作用域的产生

  1. 模块(modules)
  2. 类(class)
  3. 函数(def, lambda)

以上三类才会引入新的作用域
其它的代码块(如if、try、for等)是不会引入新的作用域的

三、修改不同作用域变量的值

  1. 局部作用域修改全局作用域(global)
global_int = 10   # 全局变量


def fun():
    global global_int
    print("函数内部未修改前", global_int)  # 未修改前
    global_int += 10
    print("函数内部修改后", global_int)

    
print("函数外部未执行函数fun", global_int)
fun()
print("函数外部执行函数fun", global_int)

运行结果:
函数外部未执行函数fun 10
函数内部未修改前 10
函数内部修改后 20
函数外部执行函数fun 20

  • global: 声明全局变量,要对函数外部变量进行修改时, 就可以使用global声明要修改的变量
  1. 外层作用为非全局作用域(nonlocal)
def func_test():
    test_var = 10

    def test():
        nonlocal test_var
        print(f"内层函数test未修改: test_var:{test_var}")
        test_var += 10
        print(f"内层函数test修改后: test_var:{test_var}")

    print(f"外层函数func_test未执行内层函数test: test_var:{test_var}")
    test()
    print(f"外层函数func_test执行内层函数test: test_var:{test_var}")

func_test()

执行结果:
外层函数func_test未执行内层函数test: test_var:10
内层函数test未修改: test_var:10
内层函数test修改后: test_var:20
外层函数func_test执行内层函数test: test_var:20

  • nonlocal: 嵌套作用域中, 内层作用域要修改外层作用域的变量时, 使用nonlocal关键字声明局部变量
原文地址:https://www.cnblogs.com/duyupeng/p/13138369.html