2009-04-13 7 views
4

foo.py :파이썬에서의 가져 오기는 정적입니까, 어떤 해결책입니까?

i = 10 

def fi(): 
    global i 
    i = 99 

bar.py는 :

import foo 
from foo import i 

print i, foo.i 
foo.fi() 
print i, foo.i 

이 문제가된다. foo.i이 변경되면 i이 변경되지 않는 이유는 무엇입니까?

+0

출력은 다음과 같습니다. 10 10 \ n 10 99 –

+0

질문은 명확하지 않습니다. foo.i 만 사용하면 문제가 정확히 무엇입니까? 게으름? – hasen

+0

이것은 아주 초보자가하는 분명한 질문입니다. 그는 foo.fi()를 호출 한 후 나는 99가되기를 바란다. 나는 그가 누락 된 것이 모듈의 실행이라고 생각한다. 중화하려면 +1하십시오. –

답변

7

foo.py 모듈 네임 스페이스 i라는 식별자와 동일한 어드레스를 가리키는 bar.py 모듈 i 네임 스페이스라고하는 식별자를 설정한다.

이 ... 중요한 차이입니다 bar.i가 아니라 객체 10foo.i 동시에 가리 키도록 일어나는 개최되는 메모리에 같은 공간에, foo.i 가리키는되지 않습니다. 파이썬에서 변수 이름은 메모리 공간이 아닙니다 ... 그들은 메모리 공간을 가리키는 식별자입니다. 막대로 가져올 때 로컬 네임 스페이스 식별자를 설정합니다.

foo.fi()이 호출 될 때까지 코드가 예상대로 동작합니다. foo.py 네임 스페이스의 식별자 i이 10 이외의 다른 장소에있는 메모리의 개체 인 리터럴 99를 가리 키도록 변경되었을 때 코드가 동작합니다. 이제 모듈 foo에 대한 수준의 네임 스페이스 사전에 bar39의 식별자 i보다 다른 메모리 개체를 식별하는 i이 있습니다.

쉐인과 rossfabricant는 원하는 것을 얻기 위해 모듈을 조정하는 방법에 대한 좋은 제안을 가지고 있습니다. foo.py 내부

0

전역 변수를 참조하는 대신 함수를 호출 할 수 있습니다.

8

은 무엇 로스가 말하고있는 것은과 같이 foo는 restucture하는 것입니다

_i = 10 

def getI(): 
    return _i 

def fi(): 
    global _i 
    _i = 99 

그런 다음 당신은 당신이 원하는 방식으로 작동합니다 볼 수 있습니다 : 그것은 또한 의미에서 '더 나은'이다

>>> import foo 
>>> print foo.getI() 
10 
>>> foo.fi() 
>>> print foo.getI() 
99 

을 그 글로벌 익스포트는 피하지만 여전히 글로벌 읽기를 제공합니다. importbar.py에 무엇

3

ibar.py에서 하나로부터 다른 i이다. bar.py에 당신이 할 때 :

foo.pyi와 같은 객체에 참조하는 bar.py의 새로운 i를 생성
from foo import i 

.

귀하의 문제는 : 당신이 foo.fi()를 호출하고 있다는 않는 경우 :

i = 99 

그 할당은 또 다른 정수 객체 (99)에 foo.pyi 점을합니다. 정수 객체는 자체적으로 변경할 수 없으므로 (고맙게도) foo.pyi이 가리키는 내용 만 변경됩니다.bar.pyi이 아닙니다. bar.pyi은 여전히 ​​이전에 가리킨 이전 개체를 가리 킵니다.

print foo.i 

99를 인쇄해야합니다 : 당신은 내가 bar.py에서 다음 명령을 배치하여에 대해 이야기하고 무엇을 테스트 할 수 있습니다

(정수 불변의 객체 10).

+0

좋은 설명. –

관련 문제