2017-12-18 2 views
0

파이썬에서 네임 스페이스와 스코프에 관한 스크립트를 실행했습니다.이 두 가지 개념을 혼용하여 사용하기 때문에이 스크립트가 어떻게 실행되는지 알 수 없습니다. 여기에 코드가 있습니다 :파이썬의 네임 스페이스와 스코프

j, k = 1,2 
def proc1(): 
     j, k = 3, 4 
     print “ j == %d and k == %d” % (j, k) 
     k = 5 

def proc2(): 
     j = 6 
     proc1() 
     print “ j == %d and k == %d” %(j , k) 

k = 7 
proc1() 
print “ j == %d and k == %d” % (j, k) 

j = 8 
proc2() 
print “ j == %d and k == %d” % (j, k) 

이 스크립트의 출력에는 4 개의 인쇄 표현식 만 포함되어야하지만, 실행하면 5 개가됩니다. 게다가, 각 줄의 j와 k의 값 또한 내가 예상했던 것과는 전혀 다릅니다. 누군가 어떻게 이것이 실행되는지 설명 할 수 있습니까?

이러한 코드 조각에서 네임 스페이스와 범위를 자세히 설명 할 수 있다면 진심으로 감사드립니다. 게다가, 현재 Python 2.7.14가 설치된 내 컴퓨터에서 실행했을 때의 출력 결과는 다음과 같습니다. output result] 당신의 변수가 사는 방법을 설명 1

+0

그것은 때문에'proc2'이, 선이의 정의에 오 개 출력을 인쇄 'PROC1()'변수에 대한 의'J, k'는 함수에 대해 지역적이며, j_1, k_1 및 j_2, k_2를 호출하고 함수 범위에 바인딩됩니다. – BadMiscuit

+0

@BadMiscuit 많이 감사합니다! 그런 식으로, 값은 무엇입니까? j와 k는 두 번째 함수 뒤에 있습니다 - proc2? 늦게 답장을 드려서 죄송합니다 – user8542107

+0

첫 번째 j와 k (j_0과 k_0을 말하도록 할 수 있습니다)에 대해 j = 8과 k = 7이어야합니다 (출력에서와 같이) 함수가이 값을 수정하지 않기 때문에 (임시 변수를 만듭니다) – BadMiscuit

답변

0

작은 윤곽

Scope and liveness

편집 : 실제로 완전히 정확하지 않은 부분이 '이전 j_1와 함께 사는 결코이 일이 있기 때문에 우리가 j_1 재사용 할 수있다', proc2proc1라고 전화하면 그들은 함께 살 수 있습니다. 그래서 proc2 파란색 j_1 (j는 실제로 j_2이다. 내가 윤곽을 변경했습니다.

+1

와우, 당신의 설명은 대단합니다! 나를 밝게해라! 나는 당신의 상세하고 전문적인 도움을 당신에게 충분히 감사 할 수 없었다. 다시 한 번 감사드립니다! – user8542107

+0

그래도 질문이 하나 있습니다. 이 함수를 실행 한 후 왜 pro1에서 k가 변경되지 않습니까? 일명, proc1의 "k = 5"는 왜 아무런 목적도 못 느낍니까? – user8542107

+0

@ user8542107'proc1()'의'k = 5'가'k_1 = 5'와 비슷하기 때문에 가장 안쪽 범위에서 정의한 변수에 새로운 값을 할당하게됩니다 – BadMiscuit