2016-11-09 23 views
0

我有一个简单的Python模块文件First.py更改值

a = 50 
b = [100,200,300] 

我尝试这个模块导入到另一个文件Test.py

import First 
First.a = 420 
First.b[0] = 420 
print (First.a) 

我的目的是要改变列表值在第一个模块中。

一旦脚本Test.py完成时,我打印模块内的值,我发现值没有改变。

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (I 
tel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import First 
>>> dir(First) 
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', 
'__package__', '__spec__', 'a', 'b'] 
>>> First.a 
50 
>>> First.b 
[100, 200, 300] 

我在这里错过了什么?有人可以引导我吗?

+0

的任何变化都在运行时,它们不会在会话之间持续。模块的文本没有改变。 – AChampion

回答

1

一旦脚本Test.py完成时,我打印模块内的值,我发现值没有改变。

如果执行python Test.py然后交互发射了你的解释,并检查了值,当然,修改将不可见。 Python找到First.py后,找到import,执行它并初始化ab,其值为First.py;以前的执行不会影响这一点。

如果您导入您的交互式解释Test然后进口First变化将反映:

Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import Test 
420 
>>> import First 
>>> First.a 
420 
>>> First.b 
[420, 200, 300] 

期间Test进口,First被加载并执行,那么它的值修改。当您重新导入Python会只是看在导入模块(sys.modules)一张桌子和不执行其内容返回它(并重新初始化ab

+0

但我不确定我是否遵循100%。根据我的理解,Python不会重新加载并运行一个模块文件,一旦它已经被加载并且.pyc文件被创建。那么为什么在第一种情况下,模块代码会重新运行,最终重新初始化变量,并且代码不会在第二次运行。在这两种情况下,模块已经加载。 –

+0

@SubhayanBhattacharya是的,生成'.pyc'文件,但没有区别。当你运行(不导入)'Test.py'时,它改变为'First.py'不是持久的; '.pyc'文件具有*相同的*字节码指令。当你导入Test时,你也可以导入First,然后改变它的值,但是.pyc在这里并不真正扮演一个角色:-)。 –