네임스페이스의 개념은 변수의 표시 여부와 수명 주기의 길이를 구분하고 제어하기 위해 제안되었습니다.
영역을 나누어 모든 데이터를 저장하고 사전에 저장합니다(변수와 값이 매핑 관계를 형성함). 총 3가지 종류가 있습니다.
내장 네임스페이스:
인터프리터가 시작될 때 생성되며 인터프리터가 끝날 때까지 가장 긴 수명 주기
글로벌 네임스페이스:
파일이 실행될 때 생성되며 인터프리터가 끝날 때까지 가장 긴 수명 주기 ;
로컬 네임스페이스:
내부의 로컬 변수는 번호가 호출될 때만 생성되고 호출이 완료된 후 해제되며 수명 주기가 짧습니다.
생성 및 소멸 순서
생성 순서:
Python 인터프리터 시작 -> 내장 네임스페이스 생성 -> 로컬 네임스페이스 생성
파괴 순서:
함수 호출이 완료된 후 -> 함수 -> 전역 네임스페이스 데이터 삭제 - >내장 네임스페이스 데이터 삭제
전역 변수와 지역 변수란 무엇인가요?
로컬 변수는 함수 내부에 정의된 변수입니다. 로컬 변수는 로컬 네임스페이스에 있습니다. 해당 함수 필드는 함수 내부에서만 표시됩니다. 즉, 함수 내부에서만 사용할 수 있습니다.
# 在函数中创建的变量就是局部变量 def func(): var = '局部变量' # 局部变量不可以在非对应局部环境中使用 print(var) # error, 该变量不存在
전역 변수는 함수 외부에서 정의되거나 전역 변수를 사용하여 함수 내부에서 정의되는 변수입니다. 전역 변수가 위치한 네임스페이스는 전역 네임스페이스입니다. 사용할 수 있습니다.
# 在全局环境中创建的变量就是全局变量 var = '全局变量' def func(): # 在局部中也可以使用全局变量 print(var) # 全局变量 func()
글로벌 변수와 이름이 같은 로컬 변수는 사용하지 않는 것이 가장 좋습니다. 이름이 같으면 로컬 환경에서 글로벌 변수를 사용할 수 없습니다.
var = '全局变量' def func(): # 先使用了全局变量 print(var) # error, 找不到该变量 # 然后局部变量和全局变量同名,那么新的局部变量就会在局部空间中覆盖了全局变量的一切影响力,这就叫做局部变量修改了全局变量; # 这样的话导致在局部空间中无法在使用该全局变量,之前在局部空间中使用的该变量就成为了先调用后定义;导致出错。 var = '局部变量' print(var) func() # 但是局部同名变量不会影响到全局变量的值 print(var) # 全局变量
내장 함수는 Python과 함께 제공되는 내장 함수를 참조하는 내장 네임스페이스입니다.
로컬 변수 범위: 함수 내부
전역 변수 범위:전체 파일
로컬 변수는 생성부터 시작되어 종료될 때까지 계속됩니다. local 실행이 완료되거나 지워지면 공간이 해제됩니다.
5. 모든 로컬 함수 및 키워드 사용
globals()
은 전역 범위의 모든 내용을 반환합니다. . 글로벌인 경우 globals
를 호출한 후 인쇄 전 모든 변수를 가져오고 사전이 반환되며
# 定义一些全局变量 a, b, c = 1, 2, 3 # 调用globals函数 res = globals() # 第一次打印,包含a b c print(res) ''' 结果: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002DBDCA5D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'res': {...}} ''' # 再定义一些变量 d, e, f = 1, 2, 3 # 第二次打印,包含a b c d e f print(res) ''' 结果: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002DBDCA5D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'res': {...}, 'd': 1, 'e': 2, 'f': 3} '''
로컬인 경우 globals
, 호출 전에 사용된 변수를 가져오고 사전 및 전역 공간 범위를 반환합니다.
# 定义一些全局变量 a, b, c = 1, 2, 3 # 在局部环境中使用globals函数 def func(): res = globals() print(res) # 调用函数 func() ''' 结果:不包含 d e f {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001E7C287D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'func': <function func at 0x000001E7C2772F28>} ''' # 再定义一些全局变量 d, e, f = 4, 5, 6 # 第二次调用函数 func() ''' 结果:包含 d e f {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000021A3F3DD198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'func': <function func at 0x0000021A3F2D2F28>, 'd': 4, 'e': 5, 'f': 6} '''
globals
之后,获取的是打印之前的所有变量,返回字典,全局空间作用域;dic = globals() print(dic) # 返回系统的字典 ''' 结果: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000026F357ED198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'dic': {...}} ''' # 在全局的字典当中,通过添加键值对,自动创建全局变量,对应的键是变量名,对应的值是变量指向的值 dic['msr123123123'] = '123456' print(msr123123123) # 123456 # 查看全局内容 print(dic) ''' 结果: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000161D944D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'dic': {...}, 'msr123123123': '123456'} '''
如果在局部,调用globals
之后,获取的是调用之前的所用变量,返回字典,全局空间作用域;
# 定义一些全局变量 a, b, c = 1, 2, 3 # 调用locals函数 res = locals() # 第一次打印,包含a b c print(res) ''' 结果: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000018C82A3D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test1.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'res': {...}} ''' # 再定义一些变量 d, e, f = 1, 2, 3 # 第二次打印,包含a b c d e f print(res) ''' 结果: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000018C82A3D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test1.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'res': {...}, 'd': 1, 'e': 2, 'f': 3} '''
globals可以动态创建全局变量
# 定义一些局部变量 def func(): # 局部变量 aa, bb, cc = 11, 22, 33 # 第一遍调用 res = locals() # 第一次打印,包含 aa bb cc print(res) # {'cc': 33, 'bb': 22, 'aa': 11} # 再定义一些局部变量 dd, ee, ff = 44, 55, 66 # 第二次打印,不包含 dd ee ff print(res) # {'cc': 33, 'bb': 22, 'aa': 11} # 调用第二遍 res2 = locals() # 打印第一次的调用,包含 dd ee ff print(res) # {'cc': 33, 'bb': 22, 'aa': 11, 'ff': 66, 'ee': 55, 'dd': 44, 'res': {...}} # 打印第二次的调用,包含 dd ee ff print(res2) # {'cc': 33, 'bb': 22, 'aa': 11, 'ff': 66, 'ee': 55, 'dd': 44, 'res': {...}} # 调用函数,返回在函数中的局部变量 func()
locals()
返回当前所在作用域的所有内容。
如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域;
def func(): var = '局部变量' global glvar glvar = '全局变量' # 一定要执行局部环境哟 func() # 全局环境中 print(var) # error,局部变量不能调用 # 使用global定义的变量是全局变量 print(glvar) # 全局变量
如果在局部,调用locals
之后,获取的是调用之前的所有变量,返回字典,局部空间作用域;
var = '全局变量' def func(): global var var = '局部环境中修改' func() print(var) # 局部环境中修改
关键字
global
在局部环境中创建的变量是局部变量,在全局环境中是不可以使用的。但是使用global定义的变量就是一个全局变量,这个变量可以全局环境中使用。
def outer(): print('我叫outer,是外函数') def inner(): print('我叫inner,在outer的里面,是内函数') # 在外函数中执行内函数 inner() # 执行外函数 outer() ''' 结果: 我叫outer,是外函数 我叫inner,在outer的里面,是内函数 '''
在局部环境中无法修改全局变量的值,使用global
globals는 전역 변수를 동적으로 생성할 수 있습니다.
# 外层是outer,内层是inner,最里层是smaller,调用smaller里的所有代码 def outer(): print('我叫outer,是最外层函数,是inner和smaller的外函数') def inner(): print('我叫inner,是outer的内函数,是smaller的外函数') def smaller(): print('我叫smaller,是outer和inner的内函数') # 先在inner中执行smaller smaller() # 然后在outer中执行inner inner() # 最后再执行outer才能执行smaller函数 outer() ''' 结果: 我叫outer,是最外层函数,是inner和smaller的外函数 我叫inner,是outer的内函数,是smaller的外函数 我叫smaller,是outer和inner的内函数 '''locals()
는 현재의 모든 내용을 반환합니다. 범위. 글로벌인 경우 로컬을 호출한 후 인쇄하기 전에 모든 변수를 가져오고 사전 반환, 전역 공간 범위를 가져옵니다.
def outer(): # 定义变量 lvar = 'outer var' def inner(): # 内函数使用nonlocal修改上一层的局部变量 nonlocal lvar lvar = 'inner var' # 执行inner函数 inner() print(lvar) outer() # inner var로컬인 경우
locals
를 호출한 후 모든 변수를 가져옵니다. 호출 전 변수 모든 변수, 반환 사전, 로컬 공간 범위 def outer(): # 定义变量 lvar = 'outer var' def inner(): def smaller(): # smaller中修改变量,但是inner中没有,就向上寻找修改outer中的变量 nonlocal lvar lvar = 'smaller var' # 执行 smaller函数 smaller() # 执行inner函数 inner() print(lvar) # 执行outer函数 outer()
global
var = 1 # 变量在最外层的函数之外,也就是全局变量,nonlocal无法修改 def outer(): def inner(): def smaller(): nonlocal var # error,没有局部变量 var = 2 print(var) smaller() inner() outer()글로벌 변수의 값은 로컬 환경에서 수정할 수 없습니다. 로컬 환경에서 글로벌 변수를 수정하려면
global
을 사용하세요. # 外层是outer,内层是inner,最里层是smaller,调用smaller里的所有代码 def outer(): print('我叫outer,是最外层函数,是inner和smaller的外函数') def inner(): print('我叫inner,是outer的内函数,是smaller的外函数') def smaller(): print('我叫smaller,是outer和inner的内函数') # 先在inner中执行smaller smaller() # 然后在outer中执行inner inner() # 最后再执行outer才能执行smaller函数 outer() ''' 结果: 我叫outer,是最外层函数,是inner和smaller的外函数 我叫inner,是outer的内函数,是smaller的外函数 我叫smaller,是outer和inner的内函数 '''
我们在多个函数嵌套的时候要注意,不管外函数还是内函数,都是函数,只要是函数中的变量都是局部变量。
内涵可以使用外函数的局部变量,外函数不能直接使用内函数的局部变量。
LEGB原则就是一个就近找变量原则,依据就近原则,从下往上,从里向外,依次寻找。
B————Builtin(Python):Python内置模块的命名空间 (内建作用域)
G————Global(module):函数外部所在的命名空间 (全局作用域)
E————Enclosing Function Locals:外部嵌套函数的作用域(嵌套作用域)
L————Local(Function):当前函数内的作用域 (局部作用域)
nonlocal
现在我们正式学习nonlocal关键字,nonlocal的作用是修改当前局部环境中上一层的局部变量。那么我们根据这个作用便知道了nonlocal的使用环境至少是一个二级的嵌套环境,且外层的局部环境中必须存在一个局部变量。
def outer(): # 定义变量 lvar = 'outer var' def inner(): # 内函数使用nonlocal修改上一层的局部变量 nonlocal lvar lvar = 'inner var' # 执行inner函数 inner() print(lvar) outer() # inner var
假如上一层的局部环境中没有这个变量怎么办,那么就根据LEGB原则向上寻找。
def outer(): # 定义变量 lvar = 'outer var' def inner(): def smaller(): # smaller中修改变量,但是inner中没有,就向上寻找修改outer中的变量 nonlocal lvar lvar = 'smaller var' # 执行 smaller函数 smaller() # 执行inner函数 inner() print(lvar) # 执行outer函数 outer()
如果层层寻找,直到最外层的函数中也没有这个变量,那么就会报错,因为nonlocal只会修改局部变量,如果超出范围,就会报错。
var = 1 # 变量在最外层的函数之外,也就是全局变量,nonlocal无法修改 def outer(): def inner(): def smaller(): nonlocal var # error,没有局部变量 var = 2 print(var) smaller() inner() outer()
全局变量和局部变量
局部环境中可以调用全局变量,但是不能修改(但是如果全局变量是可变数据则可以修改其中的值)
全局环境中不能调用局部变量 也不能修改
函数
global()
(在函数内部使用,可以对全局变量进行操作)
1、可以在局部环境中定义全局变量
2、可以在局部环境中修改全局变量
nonlocal()
(在内函数中使用,可以在内函数中修改外函数中的局部变量)
关键字:
locals
1、locals获取当前作用域当中所有的变量
如果在全局调用locals之后,获取的是打印之前的所有变量,返回字典,全局作用域
如果在局部调用loclas之后,获取的是调用之前的所有变量,返回字典,局部作用域
globals
2、globals只获取全局空间中的所有变量
如果在全局调用globals之后,获取的是打印之前的所用变量,返回字典,全局作用域
如果在局部调用globals之后,获取的是调用之前的所用变量,返回字典,全局作用域
위 내용은 Python의 전역 공간과 로컬 공간의 정의 및 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!