导入了Python模块;为什么重新分配其中的成员也会影响其他地方的进口?

时间:2016-08-25 11:49:35

标签: python import

我看到了我不理解的Python行为。考虑这种布局:

project
|   main.py
|   test1.py
|   test2.py
|   config.py

main.py:

import config as conf
import test1
import test2

print(conf.test_var)
test1.test1()
print(conf.test_var)
test2.test2()

test1.py:

import config as conf

def test1():
    conf.test_var = 'test1'

test2.py:

import config as conf

def test2():
    print(conf.test_var)

config.py:

test_var = 'initial_value'

所以,python main.py产生:

initial_value
test1
test1

我对最后一行感到困惑。我认为它会再次打印initial_value,因为我再次在config.py中导入test2.py,我认为我在上一步中所做的更改将是覆盖。我误解了什么吗?

5 个答案:

答案 0 :(得分:27)

Python缓存导入的模块。第二个import调用不会重新加载文件。

答案 1 :(得分:8)

test2.py

import config as conf

def test2():
    print(id(conf.test_var))
    print(conf.test_var)

test1.py

import config as conf

def test1():
    conf.test_var = 'test1'
    print(id(conf.test_var))

像这样更改代码。

并运行main.py

initial_value
140007892404912
test1
140007892404912
test1

因此,您可以看到,在这两种情况下,您都在更改同一变量的值。看到这些id是一样的。

答案 2 :(得分:4)

您已在test_var中修改了test1.py,然后使用test2.py重新打印了它。再次导入不会改变事实,而不是为变量赋予新值 - 它不会"重置"第一个的价值。

答案 3 :(得分:4)

您在运行test_var时更改了test1的值,因此在您运行test2时它已经更改。

对于您导入它的每个文件,该变量都不会重置。这将是一切的价值。

答案 4 :(得分:1)

不,您在config.py中使用test1()更改为常量值。 这不会被重置。由于您在test2()中打印,因此会再次打印修改后的值。