1、局部变量
- 定义在函数内部的变量称为局部变量(函数的形参也是局部变量),只能在函数内部使用
- 局部变量在函数调用时才能够被创建,在函数调用结束之后会自动销毁
- 在函数内首次对变量赋值时创建局部变量,再次为变量赋值是修改局部变量的绑定关系
- 在函数内部的赋值语句不会对全局变量造成影响
- 局部变量值能在其被声明的函数内部访问,而全局变量可整个模块同访问
2、全局变量
- 定义在函数外部,模块内部的变量称为全局变量
- 所有的函数都可以直接访问全局变量,但是函数内部不能直接通过赋值语句来改变全局变量。
- 注:python中全局变量和局部变量的最大区别在于局部变量只能通过函数去访问,而全局变量可以直接访问。
3、globals()函数和locals()函数
- globals() 返回当前全局作用域内变量的字典
- locals() 返回当前局部作用域内的变量的字典
#此示例示意globals()函数和locals()函数的用法
a = 1
b = 2
c = 3
def fx(c,d):
e = 300
#此处有几个局部变量?
print("locals()返回",locals())
#有几个全局变量?
print("globals()返回",globals())
fx(100,200)
运行结果:
locals()返回 {'e': 300, 'd': 200, 'c': 100}
globals()返回 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001E6F8603F98>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\Administrator\\Documents\\Aptana Studio 3 Workspace\\Demo12\\123.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'fx': <function fx at 0x000001E6F8502E18>}
4、global语句和nonlocal语句
- global语句作用:
- 1、告诉解释器,global语句声明的一个或多个变量,这些变量的作用域为模块级的作用域(全局变量)
- 2、全局声明,将赋值的变量映射到模块文件内部的作用域。
- global语句语法:global 变量1,变量2
- 1、全局变量如果要在函数内部被复制,则必须经过全局声明(否则会被认为是全局变量)
- 2、全局变量在函数内部不经过声明就可以直接访问
- 3、不能先创建局部变量,在用global声明为全局变量,这样不符合规则。
- 4、 global变量列表里的变量名不能出现在此作用域内形参列表里
#此示例示意globals声明
v = 100
def fn():
#添加全局声明,本函数内变量v编程全局变量
global v
v = 200
fn()
print(v)
运行结果:
200
- nonlocal语句作用:
- 告诉解释器,nonlocal声明的变量不是局部变量或全局变量,而是外部嵌套函数内的变量。
- nonlocal的语法:nonlocal 变量名1,变量名2,......
- 1、nonlocal 语句只能在被嵌套的函数内部进行使用
- 2、访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作
- 3、当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近一层的变量进行操作。
- 4、nonlocal语句的变量列表里的变量名,不能出现在此函数参数列表中。
#nonlocal使用
var = 100
def f1():
var = 200
print("f1里面的var=",var)
def f2():
nonlocal var
var = 300
f2()
print("f1调用结束时var=",var)
f1()
print("全局的var=",var)
运行结果:
f1里面的var= 200
f1调用结束时var= 300
全局的var= 100
5、python的作用域
- 作用域也叫命名空间,是访问变量时查找变量名的范围空间。
python的四个作用域LEGB | ||
作用域 | 英文解释 | 英文缩写 |
局部作用域(函数内) | Local(function) | L |
外部嵌套函数作用域 | Enclosing function locals | E |
函数定义所在模块(文件)的作用 域 | Globals(module) | G |
python内置模块的作用域 | Builtin(python) | B |
- 变量名的查找规则:
- 1、在访问变量时先查找本地变量,然后是包裹此函数外部的函数内部的变量,之后是全局变量,最后是内置(内建)变量 L------>E------>G-------->B
- 2、在默认情况下,变量名赋值会创建或者改变本地作用域变量。
#python的四个作用域
v = 100
def fun1():
v = 200
print("fun1.v",v)
def fun2():
v = 300
print("fun2.v",v)
fun2()
fun1()
print("全局的V=",v)
运行结果:
fun1.v 200
fun2.v 300
全局的V= 100