Python干货-变量的作用域

xiaoxiao2025-04-19  12

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

变量作用域

变量的作用域一共分4种:

局部作用域(Local)闭包函数外的函数中(Enclosing)全局作用域(Global)内建作用域(Built-in)

变量的访问顺序为:

先查找局部作用域,如果没有则在装饰函数外的函数中查找,如果没有则在全局作用域查找,如果没有则在内建作用域查找

示例:

x = int(2.9) # 内建作用域,内建作用域变量一般可以在python的库中找到 g_count = 0 # 全局作用域 def outer(): o_count = 1 # 闭包函数外的函数中 def inner(): i_count = 2 # 局部作用域

在Python程序设计中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其他的代码块(如 if/elif/else/、tyr/except、for/while等)不会引用新的作用域,也就是说,这些语句内定义的变量,在外部也可以访问

示例:

if True: m1 = 'if中变量' else: m2 = 'esle中变量' # 在外部访问 print(m1) if中变量 def test(): test_value = '函数中变量' # 在外部访问 print(test_vale) --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-7-9b9316eb7ed1> in <module>() 3 4 # 在外部访问 ----> 5 print(test_vale) NameError: name 'test_vale' is not defined

区分全局变量与局部变量

# 定义在函数外在的变量为全局变量 total = 0 def sum(arg1, arg2): # 定义在函数内部的变量为局部变量 total = arg1 + arg2 print('函数内部是局部变量', total) return total # 调用sum函数 sum(50, 80) print('函数外部是全局变量', total) 函数内部是局部变量 130 函数外部是全局变量 0

可以看出,虽然全局变量与局部变量的名称一样,但它们可被访问的空间是不一样的。如果在内部定义一个与外部全局变量一样名称的变量,会优先操作局部变量

global 和 nonlocal 关键字

这两个关键字可以在内部作用域修改外部作用域的变量,global适用于操作全局变量,noncloal适用于闭包外的函数中的变量

示例:

num = 1 def fun1(): global num # 使用 global 关键字声明,来使用全局变量num print('在内部打印外部全局变量 num', num) num = 123 # 重新为外部变量num赋值 print('在内部改变外部全局变量num的值', num) print('未调用函数前num的值', num) fun1() print('调用函数后num的值', num) 未调用函数前num的值 1 在内部打印外部全局变量 num 1 在内部改变外部全局变量num的值 123 调用函数后num的值 123 def outer(): num = 10 def inner(): nonlocal num # 声明nonlocal关键字来使用闭包外部的变量 print('在嵌套函数中使用num的值', num) num = 100 # 改变num的值 print('嵌套函数中改变num的值', num) # 调用嵌套函数 inner() print('调用嵌套函数后num的值', num) outer() 在嵌套函数中使用num的值 10 嵌套函数中改变num的值 100 调用嵌套函数后num的值 100
转载请注明原文地址: https://www.6miu.com/read-5028626.html

最新回复(0)