2016-06-07 2 views
0

변수가 전역 변수임을 나타내면 변수가 아직 생성되지 않은 경우 해당 변수를 생성하지 않습니다. 글로벌 문 은 실제로과 어떻게 다릅니 까? 그것은 그것이 수정되기 위해 존재할 필요가 없기 때문에 분명히 단지 그것을 수정하는 것이 아닙니다. 이이 범위를 벗어날 수여기서 liveth는 파이썬에서 선언했지만 정의되지 않은 전역 변수를 선언합니까?

def foo(): 
    global cat, dog 
    dog = 1 

foo() 
print('dog' in globals()) # => True 
print(dog) # => 1 
print('cat' in globals()) # => False 
print(cat) # => NameError 

을 진행하면이 또한 오류 (놀라운 일이 아니다)을 제기

def foo(): 
    global cat, dog 
    dog = 1 

def bar(): 
    cat = 2 

foo() 
bar() 
print(dog) 
print(cat) # => NameError 

그래서 분명히 글로벌 수정은 실행중인 기능의 범위 내에서 작동합니다. 어떤 방식 으로든 이것이 가비지 수집기로 인한 것입니까? 거기에 주어진 이름을 가진 개체의 생성을 기다리고 함수의 끝에서 지워지는 일부 팬텀 globalizer 객체가 있습니까?

+0

개를 값에 할당하기보다 우선적으로, 개가 없었습니다. – Goodies

+0

개가 글로벌 선언문보다 먼저 존재하지 않기 때문에 개를 직접 수정하지 않는 것이 분명합니다. 존재하지 않는 것을 수정할 수 없습니다. – Goodies

+0

가비지 컬렉터는 아무 관련이 없습니다. 'global'은 변수를 생성하지 않습니다. 'foo()'안에있는 globals()에서''cat ''을 체크하면 거짓으로 대답 할 것입니다. – gdlmx

답변

2

글로벌 문 실제로은 변수에 무엇을합니까?

전혀 없습니다.

global foo

함수의 범위 변수 이름 foo 중 발생 함수 호출 로컬 변수 대신 모듈 전역 변수 참조 foo 것을 의미한다. 변수 자체에는 아무런 영향을주지 않습니다.

이러한 변수가 어디에 있는지에 대해서는 어디에서나 실제로 "살아"있지 않습니다. 그러한 변수가 할당되면 모듈의 전역 변수 dict에 항목이 작성됩니다. 변수가 del eted이면 전역 변수 dict 항목이 지워집니다. global 선언없이 모듈 수준에서 이러한 변수를 지정하고 del을 지정하는 경우와 동일합니다.

1

글로벌은 파서의 지시어입니다.

doc. 이것은 아무것도 바뀌지 않는다는 것을 의미합니다. 또한 "글로벌 문과 동시에 구문 분석 된 코드에만 적용"됩니다. 그런 다음 마지막 줄 4. 인쇄합니다하지만 그건 그렇지 않다, 말한대로 global이 수정 인 경우이 작업은 아래의 예를

a=3 
def foo(): 
    exec('global a') 
    a=4 

foo() 
print(a) # 3 

에서 테스트 할 수 있습니다.

관련 문제