一、python变量的作用域
python中, 所有变量并不是在哪个位置都可以访问的。访问权限取决于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称
- 全局变量: 定义在函数外部的变量
- 在函数内部, 可以访问全局变量, 不能进行修改
- 局部变量: 定义在函数内部的变量
- 只能在函数内部访问, 在函数外部不能访问
num = 0 # 全局变量
def sum(arg1, arg2):
# 返回两个参数的和
num = arg1 + arg2 # num在这里是局部变量
print('局部变量:', num)
return num
sum(10, 5)
print('全局变量:', num)
python中的4种作用域
按照从上到下依次对变量进行搜索
- 局部作用域
- 嵌套的父级函数的局部作用域(闭包外层函数作用域)
- 全局作用域
- 内建作用域
二、python作用域的产生
- 模块(modules)
- 类(class)
- 函数(def, lambda)
以上三类才会引入新的作用域
其它的代码块(如if、try、for等)是不会引入新的作用域的
三、修改不同作用域变量的值
- 局部作用域修改全局作用域(
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
声明要修改的变量
- 外层作用为非全局作用域(
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
关键字声明局部变量