导入模块中的可变对象

时间:2011-09-13 06:15:23

标签: python

我读到导入模块的可变对象并就地更改它们也会影响原始导入模块的对象。 例如:

from mymod import x
x[0]=1001

所以当我这样做时:

import mymod
print(mymod.x)

打印[1001,43,bla]。 我的问题是,就地更改是否会影响模块的编译字节代码,模块的源代码(不太可能不是吗?)或我导入的命名空间?所以如果我改变了类似的东西,请稍后导入在同一个模块的某个地方计时,并尝试访问可变对象,我会得到什么?干杯。

2 个答案:

答案 0 :(得分:3)

不,它没有。当您稍后导入该模块时(或者如果另一个脚本在您的程序仍在运行的同时导入该模块),您将获得该模块的“干净”副本。

因此,如果test.py包含单行x = [1,2,3],则会获得:

>>> from test import x
>>> x[0] = 1001
>>> x
[1001, 2, 3]
>>> import test
>>> test.x
[1001, 2, 3]
>>> imp.reload(test)
<module 'test' from 'test.py'>
>>> test.x   # test is rebound to a new object 
[1, 2, 3]
>>> x        # the old local variable isn't affected, of course
[1001, 2, 3]

答案 1 :(得分:1)

在运行时对模块所做的更改不会保存回磁盘,但在Python退出之前它们处于活动状态:

test.py

stuff = ['dinner is?']

test1.py

from test import stuff
stuff.append('pizza!')

test2.py

from test import stuff

互动提示:

--> import test
--> test.stuff
['dinner is?']
--> import test1
--> test.stuff
['dinner is?', 'pizza!']
--> import test2
--> test2.stuff
['dinner is?', 'pizza!']
--> test.stuff
['dinner is?', 'pizza!']