变量作用域
变量
局部变量
- 函数内定义的变量称为局部变量,局部变量在函数外不可使用
全局变量
- 在函数外定义的变量叫做全局变量,函数中可以使用,但不可以修改
- 使用global关键之可以在函数体中定义全局变量,但使用时需要先调用函数
- 在函数外定义的全局变量,可以使用global关键字引用到函数内部(‘global ''全局变量''')
- globals()获取所有全局变量
- locals() 获取当前作用域的变量
变量数据分为两种:
- 不可变数据:在函数外部定义变量,函数内部可以使用但不可以修改
- 可变数据:在函数外部定义变量,函数内部可以使用和修改
可变代码块
# 列表
list=[1,2,3]
def func():
list[0]='aaa'
print(list)
func() # 打印结果:['aaa', 2, 3]
print(list) # 打印结果['aaa', 2, 3],已经改变原有list中内容
# 运行结果
'''
['aaa', 2, 3]
['aaa', 2, 3]
'''
# 字典
vardict={'a':'a','b':'b'}
def func():
vardict['a']='改变字典内容'
print(vardict)
func()
print(vardict)
'''
运行结果
{'a': '改变字典内容', 'b': 'b'}
{'a': '改变字典内容', 'b': 'b'}
'''
不可变代码块
num=10
def love():
print(num) #在函数内可以获取函数外部的变量
# num += 20 在函数内不可以直接更改函数外的变量
love()
函数内部定义全局变量global
def func1():
global lovei
lovei='aaa'
func1()# 函数内部定义的全局变量,外部使用前必须先调用方法,将全局变量加载到内存中
print(lovei)
'''
运行结果
aaa
'''
globals()、locals()获取全局变量
#locals()方法只在func()函数体中运行,所以locals的作用域只有函数体中的变量,而globals()方法无论在哪运行都会获取所有的全局的变量
def func():
num=1
print(locals())
print(globals())
func()
'''
locals打印结果: {'num': 1}
globals打印结果: {'__name__': '__main__', '__doc__': '\n变量数据分为两种:\n 不可变数据:在函数外部定义变量,函数内部可以使用但不可以修改\n 可变数据:在函数外部定义变量,函数内部可以使用和修改\n\n', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001DDB7C86CD0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'F:\\pythons\\21.变量的作用域.py', '__cached__': None, 'num': 10, 'love': <function love at 0x000001DDB7F3C790>, 'list': ['aaa', 2, 3], 'func': <function func at 0x000001DDB7F3C820>, 'vardict': {'a': '改变字典内容', 'b': 'b'}, 'func1': <function func1 at 0x000001DDB7E1D670>, 'lovei': 'aaa'}
'''
局部函数的作用域
# 局部函数的作用域
def outer():
print('outer是外部函数。。。')
def inner():
print('inner是内部账号。。。')
outer() # outer是外部函数。。。
inner()# 报错
# 返回结果
'''
outer是外部函数。。。
Traceback (most recent call last):
File "F:\pythons\21.变量的作用域.py", line 76, in <module>
inner()
NameError: name 'inner' is defined
'''
内函数中使用外层函数的变量 nonlocal关键字
#内部函数引用外部函数中的变量
def outer1():
print('我是外部函数')
num2=11
def inner1():
nonlocal num2
num2 +=1
print(num2)
inner1()
outer1() # 12
# print(num2) 程序报错,虽然内部引用但还是属于局部变量