Python non local 문
Python의 nonlocal
【Python 3.0】도(Python 3.0 Do)
Python 와 Python에는 help("nonlocal")
동작하지 않습니다.
. 하지 않고nonlocal
:
x = 0
def outer():
x = 1
def inner():
x = 2
print("inner:", x)
inner()
print("outer:", x)
outer()
print("global:", x)
# inner: 2
# outer: 1
# global: 0
이를 위해 , 를 사용합니다.inner()
의 »x
역시 지금이다outer()
의 »x
:
x = 0
def outer():
x = 1
def inner():
nonlocal x
x = 2
print("inner:", x)
inner()
print("outer:", x)
outer()
print("global:", x)
# inner: 2
# outer: 2
# global: 0
를 사용한다면, 그것은 구속될 것입니다.x
적절한 "글로벌" 값으로 설정합니다.
x = 0
def outer():
x = 1
def inner():
global x
x = 2
print("inner:", x)
inner()
print("outer:", x)
outer()
print("global:", x)
# inner: 2
# outer: 1
# global: 2
즉, 외부(비글로벌) 범위의 변수에 값을 할당할 수 있습니다.자세한 내용은 PEP 3104를 참조하십시오.
"python non local"에 대한 구글 검색 결과 제안서인 PEP 3104가 검색되었습니다. 이 제안서에는 성명 뒤에 있는 구문과 추론이 모두 설명되어 있습니다.요컨대, 그것은 정확히 같은 방식으로 작동한다.global
스테이트먼트(단, 함수에 대해 글로벌하지도 로컬하지도 않은 변수를 참조하기 위해 사용되는 것을 제외함)
다음은 이 기능을 통해 수행할 수 있는 간단한 예입니다.카운터 생성기는 닫힘이 있는 언어의 관용어처럼 보이도록 다시 쓰여질 수 있습니다.
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
발전기로서 쓸 수 있습니다. 예를 들어 다음과 같습니다.
def counter_generator():
count = 0
while True:
count += 1
yield count
하지만 이것은 완벽한 관용적인 비단뱀이지만, 초보자라면 첫 번째 버전이 좀 더 명확할 것 같습니다.반환된 함수를 호출하여 제너레이터를 적절하게 사용하는 것은 일반적인 혼란의 원인입니다.첫 번째 버전은 함수를 명시적으로 반환합니다.
소스 코드의 참조 포인트에 가장 가까운 "가장 가까운"이것은 「Lexical Scoping(렉시컬 스코핑)」이라고 불리며, 40년 이상에 걸쳐 표준이 되고 있습니다.
Python의 Python이라는 사전에 .__dict__
사전 검색으로는 절대 도달할 수 없습니다.
를 ,nonlocal
하다x = 7
x로 하다「」를 ,nonlocal
'x에 'x를 「 」를 지정했을 nonlocal
'x'는 'x로 하다
" " "global
가장 바깥쪽을 제외한 다른 모든 "x"는 기꺼이 무시하기 때문에 항상 낯설게 느껴졌다.
help : ('nonlocal') The
nonlocal
의 표시
nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*
nonlocal
가 가장 내에서 .바인딩의 기본 동작은 로컬 이름 공간을 먼저 검색하는 것이므로 이것은 중요합니다.이 스테이트먼트를 사용하면 캡슐화된 코드가 글로벌(모듈) 스코프 이외의 로컬스코프 외부에 변수를 재바인드할 수 있습니다.에 기재되어 있는 이름
nonlocal
에 기재되어 있는 것과 달리 스테이트먼트global
스테이트먼트는, 동봉 범위내의 기존의 바인딩을 참조할 필요가 있습니다(새로운 바인딩을 작성할 필요가 있는 범위를 명확하게 결정할 수 없습니다).에 기재되어 있는 이름
nonlocal
문은 로컬 스코프의 기존 바인딩과 충돌하지 않아야 합니다.다음 항목도 참조하십시오.
PEP 3104 - 외부 범위 내 이름에 대한 액세스
의 사양nonlocal
진술.관련 도움말 토픽: 글로벌, NAMSPACES
출처: Python Language Reference (파이썬 언어 참조)
non local 문을 사용하면 목록된 식별자가 글로벌을 제외한 가장 가까운 범위 내에서 이전에 바인드된 변수를 참조합니다.
참고문헌에서 설명한 바와 같이 여러 중첩 함수의 경우 가장 가까운 내포 함수의 변수만 수정됩니다.
def outer():
def inner():
def innermost():
nonlocal x
x = 3
x = 2
innermost()
if x == 3: print('Inner x has been modified')
x = 1
inner()
if x == 3: print('Outer x has been modified')
x = 0
outer()
if x == 3: print('Global x has been modified')
# Inner x has been modified
"가장 가까운" 변수는 여러 레벨에서 떨어져 있을 수 있습니다.
def outer():
def inner():
def innermost():
nonlocal x
x = 3
innermost()
x = 1
inner()
if x == 3: print('Outer x has been modified')
x = 0
outer()
if x == 3: print('Global x has been modified')
# Outer x has been modified
단, 글로벌 변수가 될 수 없습니다.
def outer():
def inner():
def innermost():
nonlocal x
x = 3
innermost()
inner()
x = 0
outer()
if x == 3: print('Global x has been modified')
# SyntaxError: no binding for nonlocal 'x' found
a = 0 #1. global variable with respect to every function in program
def f():
a = 0 #2. nonlocal with respect to function g
def g():
nonlocal a
a=a+1
print("The value of 'a' using nonlocal is ", a)
def h():
global a #3. using global variable
a=a+5
print("The value of a using global is ", a)
def i():
a = 0 #4. variable separated from all others
print("The value of 'a' inside a function is ", a)
g()
h()
i()
print("The value of 'a' global before any function", a)
f()
print("The value of 'a' global after using function f ", a)
"non local" 스테이트먼트에 대한 저의 개인적인 이해는 (그리고 Python과 Programming에 익숙하지 않은 점 양해 바랍니다) "non local"은 코드 본문이 아닌 반복 함수 내에서 글로벌 기능을 사용하는 방법입니다.기능 간의 Global 스테이트먼트(필요한 경우).
로컬이 아닌 내부 함수(즉, 내부 함수)를 사용하여 외부 부모 함수의 특정 변수에 대한 읽기 및 쓰기 권한을 얻을 수 있습니다.또한 로컬이 아닌 내부 기능은 다음과 같은 내부 기능에서만 사용할 수 있습니다.
a = 10
def Outer(msg):
a = 20
b = 30
def Inner():
c = 50
d = 60
print("MU LCL =",locals())
nonlocal a
a = 100
ans = a+c
print("Hello from Inner",ans)
print("value of a Inner : ",a)
Inner()
print("value of a Outer : ",a)
res = Outer("Hello World")
print(res)
print("value of a Global : ",a)
언급URL : https://stackoverflow.com/questions/1261875/python-nonlocal-statement
'programing' 카테고리의 다른 글
bash 스크립트가 MariaDB 서비스 상태를 올바르게 제공하지 않음 (0) | 2022.09.06 |
---|---|
어레이를 청크로 분할하다 (0) | 2022.09.06 |
GSON과의 JSON 해석 중 Enum 사용 (0) | 2022.09.06 |
mysql에서 문자열을 플로트로 변환하려면 어떻게 해야 하나요? (0) | 2022.09.06 |
Python에서 최소 플러그인 아키텍처 구축 (0) | 2022.09.06 |