차이점은 무엇이며 globals()
, locals()
그리고는 vars()
? 그들은 무엇을 반환합니까? 결과 업데이트가 유용합니까?
답변
이들 각각은 사전을 반환합니다.
globals()
항상 모듈 네임 스페이스 의 사전을 반환합니다locals()
항상 현재 네임 스페이스 의 사전을 반환 합니다vars()
반환 중 하나 (인수없이 호출하는 경우) 현재 이름 공간 또는 사전 인수의 사전.
locals
그리고 vars
좀 더 설명을 사용할 수 있습니다. locals()
함수 내에서 호출 된 경우 현재 시점에서 현재 로컬 변수 네임 스페이스 값 (닫기 변수 포함)으로 dict를 업데이트하여 반환합니다. locals()
동일한 스택 프레임에서 여러 번의 호출은 매번 동일한 dict를 반환 f_locals
합니다. 속성 은 스택 프레임 객체에 연결됩니다 . dict의 내용은 각 locals()
호출 및 각 f_locals
속성 액세스에서 업데이트 되지만 해당 호출 또는 속성 액세스 에서만 업데이트됩니다 . 변수가 할당 될 때 자동으로 업데이트되지 않으며 dict에 항목을 할당해도 해당 로컬 변수가 할당되지 않습니다.
import inspect
def f():
x = 1
l = locals()
print(l)
locals()
print(l)
x = 2
print(x, l['x'])
l['x'] = 3
print(x, l['x'])
inspect.currentframe().f_locals
print(x, l['x'])
f()
우리에게 주어지다:
{'x': 1}
{'x': 1, 'l': {...}}
2 1
2 3
2 2
첫 번째 항목 은 통화 후 할당이 수행되므로 항목 print(l)
만 표시합니다 . 두 번째 는 다시 호출 한 후 반환 값을 저장하지 않았지만 항목을 표시 합니다. 세 번째와 네 번째 변수는 변수를 할당해도 업데이트되지 않으며 그 반대도 마찬가지이지만 액세스 한 후에는 로컬 변수가 다시 복사 됩니다.'x'
l
locals()
print(l)
locals()
l
print
l
f_locals
locals()
두 가지 메모 :
- 이 동작은 CPython에 따라 다릅니다. 다른 Python에서는 업데이트를 통해 로컬 네임 스페이스로 자동으로 업데이트 할 수 있습니다.
- CPython 2.x에서는
exec "pass"
함수에 라인을 추가 하여이 작업을 수행 할 수 있습니다. 이를 통해 함수를locals()
지역 변수의 표준 표현으로 dict 를 사용하는 이전의 느린 실행 모드로 전환 합니다.
경우 locals()
라고 외부 함수는 현재 네임 스페이스 실제 사전을 반환합니다. 네임 스페이스에 추가 변경 되어 사전에 반영하고, 사전에 변경 하는 네임 스페이스에 반영 :
class Test(object):
a = 'one'
b = 'two'
huh = locals()
c = 'three'
huh['d'] = 'four'
print huh
우리에게 주어지다:
{
'a': 'one',
'b': 'two',
'c': 'three',
'd': 'four',
'huh': {...},
'__module__': '__main__',
}
지금까지 내가 말한 모든 내용 locals()
도 마찬가지입니다 vars()
… 차이점 vars()
은 다음과 같습니다 . 단일 객체를 인수로 받아들이고 객체를 제공하면 해당 객체의 객체를 반환 __dict__
합니다. 일반적인 객체의 __dict__
경우 대부분의 속성 데이터가 저장되는 위치입니다. 여기에는 클래스 변수 및 모듈 전역이 포함됩니다.
class Test(object):
a = 'one'
b = 'two'
def frobber(self):
print self.c
t = Test()
huh = vars(t)
huh['c'] = 'three'
t.frobber()
그것은 우리에게 :
three
함수 __dict__
는 로컬 변수가 아닌 속성 네임 스페이스입니다. __dict__
재귀와 멀티 스레딩은 각각 고유 한 지역 변수를 사용하여 동시에 함수를 여러 번 호출 할 수 있기 때문에 함수가 지역 변수를 저장 하는 것은 의미가 없습니다 .
def f(outer):
if outer:
f(False)
print('Outer call locals:', locals())
print('f.__dict__:', f.__dict__)
else:
print('Inner call locals:', locals())
print('f.__dict__:', f.__dict__)
f.x = 3
f(True)
그것은 우리에게 :
Inner call locals: {'outer': False}
f.__dict__: {'x': 3}
Outer call locals: {'outer': True}
f.__dict__: {'x': 3}
여기서는 f
재귀 적으로 호출되므로 내부 및 외부 호출이 겹칩니다. 이 호출 할 때 각자는 자신의 지역 변수를 볼 수 locals()
있지만, 두 호출은 동일한 참조 f.__dict__
하고, f.__dict__
그 안에있는 지역 변수가 없습니다.