2012-02-26 4 views
1

함수 환경 (전역, 로컬)을 이해하려고합니다.Python의 함수 환경을 이해하려고 시도했습니다.

def g(x): 
    print(x) 

def f(f): 
    f(1) 

f(g) 

누군가가이 개념을 좀 도와 주시겠습니까 : 중첩 이미 예를 들어, 전역으로 정의 된 함수가있는 경우 특히, 나는 매우 혼란스러워? 나는 그것을 매우 감사 할 것이다.

감사합니다.

+4

"매우 혼란 스럽네요."무엇 때문에? 무엇이 혼란 스럽습니까? "이 개념으로 나를 도와 줘"? 무엇을 도와 드릴까요? 무엇을 이해하도록 도와 주시겠습니까? 혼란스러운 부분이 무엇인지 분명히해야합니다. '>>>'프롬프트에서 이것을 실행하면 어떻게됩니까? –

+1

"향후 질문"? 왜 기다려? 지금이 문제를 해결할 수 있습니다. 비슷한 혼란을 가진 사람들을 도울 수 있습니다.혼란스러운 것을 설명하기 위해 모든 사람이 지금 질문을 업데이트하는 데 도움이 될 것입니다. –

답변

4

파이썬은 사전을 사용하여 로컬 변수와 전역 변수를 유지합니다. 변수 참조를 검색 할 때 먼저 로컬 사전을 조사합니다. 전역 사전에서 변수를 참조하려면 전역 키워드를 앞에 두십시오.

자세한 내용은 this에 대한 답변을 참조하십시오.

0

나는 'f (f)'에 대한 혼란 스럽지만 user18044에 동의합니까? 나는 그것이 정말로 혼동 될 수 있다는 것에 동의한다, 특히 비 유형화 된 언어에서. 'f'에 대한 인수는 이름이 'f'인 로컬 유형 범위가있는 함수 핸들입니다. 파이썬은 'f'가 사용되는 것을 결정하는 방법은 18044에 의해 설명됩니다. 파이썬은 함수 정의에서 'f'라는 이름을보고 로컬 매개 변수 'f'는 글로벌 이름 'f'에 대해 선입견을가집니다. 함수에는 전역 변수 'dude'와 지역 변수 'dude'가 있습니다. 로컬은 전역을 오버라이드합니다. 희망이 도움이되고, 의미가 있습니다. :-)

+0

예, 혼란은 f (f)에 관한 것입니다. 그것은 직관적이고, 의미 론적으로 반박하는 것처럼 보입니다. 지역이 글로벌를 대체합니다. 이것은 도움이됩니다, 대단히 감사합니다. – bmacri

+0

@Code_Phoenix : ** 당신을 혼란스럽게하는 설명을 ** ** ** 업데이트하십시오. 대답에 대한 의견으로 가져 오기 정보를 추가하지 마십시오. ** 업데이트 ** 질문. –

+0

로컬 대체 글로벌은 범위 개념이있는 모든 언어의 일반적인 동작입니다. 그것이 범위입니다. 지역적으로 정의하는 정확한 이유는 그들이 로컬에서 유용 할 가능성이 더 높기 때문입니다 (또는 오히려 그렇게해서는 안되기 때문에) "외부"의 것을 참조하는 것이 더 많은 노력을 기울여야합니다. 다른 곳에 사용). –

0

함수에 대한 지역 변수는 전달 된 모든 변수와 명시 적으로 global (또는 3.x의 nonlocal)으로 지정되고 할당되지 않은 모든 변수로 구성됩니다.

전역은 기능 자체를 포함하여 전역 범위에서 볼 수있는 모든 항목으로 구성됩니다.

이름이 참조 될 때 지역 이름에서 먼저 조회 한 다음 지역 정보에서 찾을 수없는 경우 전역에서 조회합니다.

f(g)을 실행하면 명령문 자체가 전역 범위에 있으므로 로컬이 없습니다. fg은 모두 전역 변수에서 찾을 수 있습니다. 둘 다 함수입니다. def f...에 의해 정의 된 함수가 호출되고 def g...에 의해 정의 된 함수가 인수로 전달됩니다.

f(f)이 실행되면 f이 기능을 수행하는 지역에 있습니다. 이 값은 def g...에 의해 정의 된 함수 인 전달 된 값에 바인딩됩니다. 함수의 본문에는 f(1) 문이 있습니다. 1은 상수이며 조회가 필요하지 않습니다. 지역에서 f이 조회되고 전달 된 함수가 발견됩니다. 그것은 전역 범위에서 알려진 기능이 g과 같이 호출됩니다.

따라서 g도 로컬 변수 x에 연결된 값 1으로 실행됩니다. 그 함수는 print (3.x의 2.x에서는 print이 키워드이므로 print x은 명령문입니다.) 값 1을 출력합니다.

관련 문제