全局变量和局部变量的区别详解:作用范围、使用场景及实例分析
1 全局变量和局部变量 の 区别 1.1 局部变量

[id_96[id_2043551535]63694]
作用范围在这个函数内部,意味着只能在该函数中使用,在函数外部无法使用。由于其作用范围仅在自身函数内部,所以不同的函数能够定义相同名字的局部变量。比如,把你、我当作函数,把局部变量理解为每个人手里的手机,你可以有个 iPhone11,我当然也可以有个 iPhone11,二者互不相关。
局部变量的作用在于,在函数中需要临时保存数据时,就需要定义变量来进行存储。
函数调用时会创建局部变量,函数调用完成后该变量就无法再被使用。
def show():
# 定义局部变量
sal = 15000
print("薪资:", sal)
show()
薪资: 15000
1.2 全局变量
一个变量,如果既能在一个函数里使用,又能在其他的函数里使用,那么这样的变量就是全局变量。
有 2 个兄弟,他们各自拥有手机,手机里存有各自的小秘密,彼此不让对方使用(可视为局部变量);然而,家里的电话,2 个兄弟都能够随意使用(可视为全局变量)
# 定义全局变量
money = 1200
def test1():
print(money) 没有定义变量 money ,但是可以使用全局变量 money 。
test1()
1200
总结
1.3 全局变量和局部变量冲突问题
# 定义全局变量
x = 100
def test1():
# 定义局部变量,与全局变量名字相同
x = 300
print('---test1---%d'%x)
#修改 x = 200
print('修改后的%d'%x)
def test2():
print('x = %d'%x)
test1()
test2()
—test1—300
修改后的300
x = 100
总结:
1.4 修改全局变量
函数中进行使用全局变量时可否进行修改呢?
# 定义全局变量
x = 100
def test1():
# 定义全局变量,使用global函数声明变量x为全局变量
global x
print('修改之前:%d'%x)
#修改
x = 200
print('修改之后:%d'%x)
def test2():
print('x = %d'%x)
test1()
test2()
2 global和nonlocal の 区别
# L = Local 局部作用域
# E = Enclosing 嵌套作用域
N 等于 nonlocal ,它只在嵌套作用域中起作用,并且仅仅在函数内部起作用。
# G = global 全局作用域
# B = Built-in 内置作用域
"""
locals()函数返回一个当前位置的所有局部变量的字典
globals()函数会返回一个全局变量的字典,此字典包含了所有被导入的变量。
在函数体内可以设置局部变量,其中 local 用于设置局部变量;在函数体内声明的变量,通常情况下都是局部变量。
global 被设定为全局变量,并且 global 必须在函数的内部进行设置;同时,global 还具备定义新的全局变量的功能。
nonlocal 可以在内层函数中改变外层函数的变量值,并且这种使用是有条件的,即需在内层函数中进行;同时,nonlocal 不能用于定义新的外层函数变量。
"""
def outer(c):
global a
a,b=10,20
print('【outer】a={},b={}'.format(a,b))
print('【outer】局部变量',locals())
def inner(*args, **kwargs):
nonlocal c
c=30
print(【inner】的非局部变量 c 等于空的字典 {} 。.format(c))
inner()
outer(1)
print('全局变量',globals())
【outer】a=10,b=20
【outer】局部变量 {'b': 20, 'c': 1}
【inner】nonlocal c=30
全局变量 {'__name__': '__main__', '__doc__': None,
'__package__': None,
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x02D5DD30>,
'__spec__': None,
'__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>,
'__file__': 在桌面上的 Python 代码文件夹中的 jupyter notebook 里的 te.py 文件路径为:d:\\desktop\\Python code\\jupyter notebook\\te.py,
'__cached__': None,
'outer': <function outer at 0x02F0C660>,
'a': 10}
Reference: