我看到了我不理解的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
,我认为我在上一步中所做的更改将是覆盖。我误解了什么吗?
答案 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()
中打印,因此会再次打印修改后的值。