2014-11-06 1 views
0

다음 코드에서 어떤 일이 일어나는지 설명 하시겠습니까?"import my_module"과 "from my_module import my_str"의 차이점을 설명하는 방법은 무엇입니까?

my_module.py :

my_dict = { "key": "default value" } 
my_str = "default" 

파이썬 인터프리터 :

>>> from my_module import my_dict, my_str 
>>> import my_module 
>>> 
>>> assert my_dict == { "key": "default value" } 
>>> assert my_module.my_dict == { "key": "default value" } 
>>> assert my_str == "default string" 
>>> assert my_module.my_str == "default string" 
>>> 
>>> my_dict["key"] = "new value" 
>>> my_str = "new string" 
>>> 
>>> assert my_dict == { "key": "new value" } 
>>> assert my_module.my_dict == { "key": "new value" } # why did this change? 
>>> assert my_str == "new string" 
>>> assert my_module.my_str == "default string" # why didn't this change? 
>>> 
>>> my_module.my_dict["key"] = "new value 2" 
>>> my_module.my_str = "new string 2" 
>>> 
>>> assert my_dict == { "key": "new value 2" } # why did this change? 
>>> assert my_module.my_dict == { "key": "new value 2" } 
>>> assert my_str == "new string" # why didn't this change? 
>>> assert my_module.my_str == "new string 2" 
>>> 
>>> my_dict = { "new_dict key" : "new_dict value" } 
>>> assert my_dict == { "new_dict key": "new_dict value" } 
>>> assert my_module.my_dict == { "key": "new value 2" } # why didn't this change? 

답변

0

my_module.my_strmy_module 네임 스페이스의 my_str 객체를 참조하고, my_module.my_str을 수정하면 해당 객체를 수정합니다.

from my_module import my_strmy_module.my_str 개체에서 복사 한 로컬 네임 스페이스에 my_str 개체를 만듭니다. my_str을 수정하면 로컬 네임 스페이스의 개체가 수정되지만 my_module.my_str 개체는 수정되지 않습니다.

my_dict은 로컬 네임 스페이스의 참조 번호가 my_module.my_dict입니다. 변경 가능한 객체 (사전)에 대한 참조이기 때문에 my_dict에 대한 변경은 my_module.my_dict에 영향을 주며 그 반대의 경우도 마찬가지입니다.