python - 导入封闭命名空间时全局变量的更改丢失

标签 python import scope namespaces global-variables

我在玩作用域和命名空间时发现了一个奇怪的行为,我不确定如何解释。假设我们有一个名为 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__.anew_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 模块中定义了 afunc (new_script.anew_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/

相关文章:

vb.net - 导入 : Should you, 不应该吗,语法和最佳实践

python - 导入并读取Python文件夹中的所有文件

javascript - 是否有等效于 `window` 的 es6 模块范围?

python - 从 AJAX onclick 弹出窗口中抓取内容

python - 如何在 Python Plotnine barplot 中更改 y 轴以显示百分比 (%)?

python - 绘制几个 3D 半空间的交集?

python - scipy.stats.linregress、numpy.polynomial.polynomial.polyfit 和 statsmodels.api.OLS 之间的差异

php - WordPress 从服务器导入大量图片并与帖子关联

c - 如何在C中构造 "extend"?

javascript - 在函数内定义未定义的全局变量