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
이 변경되지 않는 이유는 무엇입니까?
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
이 변경되지 않는 이유는 무엇입니까?
는 foo.py
모듈 네임 스페이스 i
라는 식별자와 동일한 어드레스를 가리키는 bar.py
모듈 i
네임 스페이스라고하는 식별자를 설정한다.
이 ... 중요한 차이입니다 bar.i
가 아니라 객체 10
가 foo.i
동시에 가리 키도록 일어나는 개최되는 메모리에 같은 공간에, foo.i
가리키는되지 않습니다. 파이썬에서 변수 이름은 메모리 공간이 아닙니다 ... 그들은 메모리 공간을 가리키는 식별자입니다. 막대로 가져올 때 로컬 네임 스페이스 식별자를 설정합니다.
foo.fi()
이 호출 될 때까지 코드가 예상대로 동작합니다. foo.py 네임 스페이스의 식별자 i
이 10 이외의 다른 장소에있는 메모리의 개체 인 리터럴 99를 가리 키도록 변경되었을 때 코드가 동작합니다. 이제 모듈 foo
에 대한 수준의 네임 스페이스 사전에 bar39의 식별자 i
보다 다른 메모리 개체를 식별하는 i
이 있습니다.
쉐인과 rossfabricant는 원하는 것을 얻기 위해 모듈을 조정하는 방법에 대한 좋은 제안을 가지고 있습니다. foo.py
내부
전역 변수를 참조하는 대신 함수를 호출 할 수 있습니다.
은 무엇 로스가 말하고있는 것은과 같이 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
을 그 글로벌 익스포트는 피하지만 여전히 글로벌 읽기를 제공합니다. import
가 bar.py
에 무엇
i
는 bar.py
에서 하나로부터 다른 i
이다. bar.py
에 당신이 할 때 :
foo.py
의 i
와 같은 객체에 참조하는
bar.py
의 새로운
i
를 생성
from foo import i
.
귀하의 문제는 : 당신이 foo.fi()
를 호출하고 있다는 않는 경우 :
i = 99
그 할당은 또 다른 정수 객체 (99
)에 foo.py
의 i
점을합니다. 정수 객체는 자체적으로 변경할 수 없으므로 (고맙게도) foo.py
의 i
이 가리키는 내용 만 변경됩니다.bar.py
의 i
이 아닙니다. bar.py
의 i
은 여전히 이전에 가리킨 이전 개체를 가리 킵니다.
print foo.i
는 99
를 인쇄해야합니다 : 당신은 내가 bar.py
에서 다음 명령을 배치하여에 대해 이야기하고 무엇을 테스트 할 수 있습니다
(정수 불변의 객체 10
).
좋은 설명. –
출력은 다음과 같습니다. 10 10 \ n 10 99 –
질문은 명확하지 않습니다. foo.i 만 사용하면 문제가 정확히 무엇입니까? 게으름? – hasen
이것은 아주 초보자가하는 분명한 질문입니다. 그는 foo.fi()를 호출 한 후 나는 99가되기를 바란다. 나는 그가 누락 된 것이 모듈의 실행이라고 생각한다. 중화하려면 +1하십시오. –