2010-11-27 2 views
4

두 번째 모듈이 순환 가져 오기에서 첫 번째 변수를 수정하도록 허용하고 있지만 작동하지 않는 것 같습니다.왜 파이썬에서 다른 모듈 변수를 변경할 수 없습니까?

2 가지 질문이 있습니다. 1) 언어 개발의 관점에서 이것이 작동하지 않는 이유는 무엇입니까? 2) 약간 다른 방식으로 동일한 작업을 수행 할 수있는 쉬운 해결책이 있습니까? 방법?

a.py :

import b 

test1 = 'a' 
test2 = None 
test3 = '3' 

if __name__ == '__main__': 
    print test1, test2, test3 #prints 'a', None, 3 
    b.changeVars() 
    print test1, test2, test3 #prints 'a', None, 3 (i.e. nothing has changed) 

b.py가 : import a-b.py 시도는, sys.modules에 대한 항목이 없을 때 항목이

import a 

def changeVars(): 
    print a.test1, a.test2, a.test3 #prints 'a', None, 3 
    a.test1 = 'NEW VAR 1' 
    a.test2 = 'NEW VAR 2' 
    a.test3 = 'NEW VAR 3' 

    print a.test1, a.test2, a.test3 #prints 'NEW VAR 1', 'NEW VAR 2', 'NEW VAR 3' 

답변

7

무엇 일어나는 것은 때문 __main__ 아래. 이로 인해 가져 오기 메커니즘에서 모듈을 다시 가져와 a이라는 이름으로 넣습니다. 이제 a 모듈과 전혀 관련이없는 __main__ 모듈이 있습니다. b.py을 이와 같이 변경하면 트릭을 수행합니다.

#a.py 
import b 
import a 

test = 'Foo' 

if __name__ == '__main__': 
    print test #prints 'Foo' 
    b.changeVars() 
    print a.test, test # prints 'Foo', 'Bar' 

#b.py 
import a as a1 

import sys 
a2 = sys.modules['__main__'] 

def changeVars(): 

    print a1.test, a2.test # Prints 'Foo', 'Foo' 
    a2.test = 'Bar' 
    print a1.test, a2.test # Prints 'Foo', 'Bar' 

출력 :

import sys 
a = sys.modules['__main__'] 

def changeVars(): 
    print a.test1, a.test2, a.test3 #prints 'a', None, 3 
    a.test1 = 'NEW VAR 1' 
    a.test2 = 'NEW VAR 2' 
    a.test3 = 'NEW VAR 3' 

    print a.test1, a.test2, a.test3 #prints 'NEW VAR 1', 'NEW VAR 2', 'NEW VAR 3' 

이러한 파일을, 무슨 일이 일어나고 있는지의 좋은 예를 얻을 수 고려해야 할

[email protected]:~/code/tmp$ python a.py 
a None 3 
a None 3 
NEW VAR 1 NEW VAR 2 NEW VAR 3 
NEW VAR 1 NEW VAR 2 NEW VAR 3 
[email protected]:~/code/tmp$ 

를 산출
Foo 
Foo Foo 
Foo Bar 
Foo Bar 

이것은 분명히 sys.modules['a']sys.modules['__main__']이 두 개의 서로 다른 개체를 나타냅니다. 이 솔루션은 물론 import a에 다른 모듈을 허용 이런 식으로 이렇게 a.py

import __main__ as a # due to Ignacio Vazquez-Abrams 

의 첫 번째 라인으로 다음을 넣어 아마. 전반적으로, 나는 왜 당신이 이것을하고 싶어하는지 알지 못합니다. 이 작업을 수행하는 더 좋은 방법이있을 것입니다.

+1

'가져 오기 __main__으로'하지만 그래,하지 마. –

+0

@ 이그나시오. 그게 그 일을 할 수 있다는 것을 잊어 버렸습니다. 나는 그것에 대해 읽었지만 결코 그것을 한 적이 없다;) – aaronasterling

0

이와 같은 작업을 수행하는 더 좋은 방법은 변경하려는 동일한 모듈의 변수를 선언하는 것입니다. 여기서는 b입니다. 그런 다음 a 안에 b을 가져오고 원하는 것을 수행 할 수 있습니다. a에 변수를 선언 한 것처럼 변수를 그대로 사용하거나 변경할 수 있습니다. 이것 좀 봐 :

b.py

test1 = 'a' 
test2 = None 
test3 = '3' 

def changeVars(): 
    global test1,test2,test3 
    test1 = 'NEW VAR 1' 
    test2 = 'NEW VAR 2' 
    test3 = 'NEW VAR 3' 

    print test1, test2, test3 #prints 'NEW VAR 1', 'NEW VAR 2', 'NEW VAR 3' 

a.py

import b 

if __name__ == '__main__': 
    print b.test1, b.test2, b.test3 #prints 'a', None, 3 
    b.changeVars() 
    print b.test1, b.test2, b.test3 #prints 'NEW VAR 1', 'NEW VAR 2', 'NEW VAR 3' 


참고 :이 경우 원 수입에 대한 필요가 없습니다; 순환 가져 오기가 문제를 일으키는 이유는 생각했던 것처럼 동작하지 않기 때문입니다. 따라서 가져 오기를 한 번만 사용하면 코드로 가져 가고 싶은 모든 것을 갖게되고 두 모듈 내에서 이러한 변수 값을 수정할 수 있습니다.