python 函数变量的作用域
1.出现的原因
变量的作用域:变量可以被使用【被访问】的范围
程序中的变量并不是在任意的语句中都可以被访问,访问权限取决于这个变量被定义在哪个位置
2.作用范围划分
局部作用域:L【Local】一般定义在函数中
函数作用域:E【Enclosing】 将变量定义在闭包外的函数中
全局作用域:G【Global】整个文件都可以调用
內建作用域:B【Built-in】python环境的内置,python环境都可以用
代码演示:
# 函数:有作用域 # 局部变量:函数内部的变量 # 特点:1.内存会被自动释放/回收(调用后会自动回收内存,退出函数就不可以使用) # 2.不会被污染 # 全局变量:整个文件都可以使用的变量 # 特点:1.内存不会释放(消耗内存,但是可以一直使用), # 2.容易被污染 (可能被其他地方修改) #1.不同作用域变量的定义 num4 = int(2.9) #B;內建作用域 num3 = 3 #G;全局作用域 def outer(): num1 = 1 #E:函数作用域 def inner(): num2 = 2 #L:局部作用域 #注意:当所有的变量不同名的时候,在闭包中,可以任意访问四种不同作用域对应的变量 print(num4,num3,num2,num1) return inner f = outer() f()
3.变量的查找规则
查找的顺序:L------>E------>G------>B【极端情况:当所有的变量同名的情况下】
代码演示:
#变量的查找规则 #注意:全局作用域和内置作用域,当重名的时候,谁出现在后面,则先匹配到谁 x = 0 x1 = int(3.3) def outer1(): j = 1 def inner1(): i = 2 #【就近原则】 print(x) return inner1 f1 = outer1() f1()
4.全局变量和局部变量
全局变量:将变量定义在函数的外面
局部变量:将变量定义在函数的内部
注意:局部变量只能在其被声明的当前函数中使用,而全局变量可以在整个程序中使用
代码演示:
#全局变量 total = 0 def show(): print(total) show() if True: total = 20 print(total) total = 10 print(total) def add(arg1,arg2): #arg1,arg2,total1都属于局部变量 total1 = arg1 + arg2 print(total1) add(10,20) #print(total1) # nonlocal 关键字 p = 1 def f4(): p = 2 def f5(): # global p #使用全局变量p nonlocal p # 使用局部变量p=2 p += 3 print('p = ',p) f5() f4()