我在玩作用域和命名空间时发现了一个奇怪的行为,我不确定如何解释。假设我们有一个名为 new_script.py 的文件,里面有
a = 0
def func():
import new_script #import itself
new_script.a += 1
print(new_script.a)
func()
print(a)
执行时打印
1
1
2
0
没想到最后打印的是数字0
。据我了解,它打印前两个 1
执行递增全局 a
的自导入语句,然后打印 2
因为它递增再次是函数内部的全局 a
,但为什么最后打印的是 0
而不是 2
?
最佳答案
TL;DR:您有两个不同的变量 __main__.a
和 new_script.a
。您只需更改 new_script.a
。
追踪它:
a = 0
在__main__
模块中定义了一个变量a
。
def func(): ...
在__main__
模块中定义了一个函数func
。
func()
在 __main__
模块中调用这个函数。在函数中:
import new_script
导入 new_script
模块,其中:
a = 0
def func(): ...
在 new_script
模块中定义了 a
和 func
(new_script.a
和 new_script.func
)
func()
从 new_script
模块调用 func
。在函数中:
import new_script
好吧,我们已经导入了它所以 we don't import it again
new_script.a += 1
print(new_script.a)
增加 new_script.a
并打印它(我们的第一个 1
)。然后
print(a)
从 new_script
模块(我们的第二个 1
)打印 a
(又名 new_script.a
)
new_script
完成。
回到 __main__
中执行:
new_script.a += 1
print(new_script.a)
第二次递增 new_script.a
并打印它(我们的 2
)。
最后:
print(a)
打印从未更改过的a
(又名__main__.a
)(所以0
)
关于python - 导入封闭命名空间时全局变量的更改丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73472218/