你想要实现的目标有很多问题,除非你故意设置一个自我修改的代码系统,它看起来不像你。
1. 全局变量
spam = 100
def set_spam(value):
spam = value
foo = reload(foo) #reload module from itself
这是行不通的。由于 Python 闭包的工作方式,您的spam = value
行将在您的函数中创建一个新的局部变量,然后不会被使用。要正确更改 global 的值,您必须使用关键字,例如:spam
set_spam
spam
global
spam = 100
def set_spam(value):
global spam
spam = value
2.“从自己”重新加载模块
据我所知,没有办法真正做到这一点,你也不应该这样做。您已import
编辑的任何模块都是从其他模块调用的,一直到__main__
. 您只需从该调用模块刷新它。是的,您可以尝试自行导入模块(尽管可能存在无限循环问题,如 mgilson 所述),但即便如此(使用名为“foo”的示例),如果您让它自行导入,您只需have foo.foo
,并且做类似的事情foo.reload(foo)
(如果这甚至是有效的)只会重新加载 sub- foo
,而不是 base 。
3. 重新foo.py
加载
# ==================================
# foo.py
spam = 100
def set_spam(value):
global spam
spam = value
请注意,在此代码的顶部,您如何将 100 分配给spam
. 每次导入模块时,您都会再次这样做。因此,即使您已经更改了spam
导入代码中的值foo
,当您重新加载模块时,您实际上也会破坏您刚刚所做的更改。例子:
>>> import foo
>>> foo.spam
100
>>> foo.spam = 9
>>> foo.spam
9
>>> reload(foo)
>>> foo.spam
100
因此,如果您想保留对变量所做的更改foo
,则不应重新加载模块。而且,你真的不需要使用set_spam
函数来改变spam
,你可以像我一样直接设置它。
4.尝试在其他模块中使用这个“改变”的模块值
最后,如果我正确理解你想要做什么,那是行不通的。这在很大程度上是因为我在第 3 部分中提到的一些事情,其中每次加载foo
时,该spam=100
行都会重置spam
. 同样,如果您foo
在两个不同的其他模块中导入模块,当每个模块导入它时,它们都会以 . 开头spam = 100
,完全独立于另一个模块对foo.spam
. 例如,如果两者都包含bar1.py
和bar2.py
包含以下行import foo
:
>>> import bar1, bar2
>>> bar1.foo.spam
100
>>> bar2.foo.spam
100
>>> bar1.foo.spam = 200
>>> bar1.foo.spam
200
>>> bar2.foo.spam
100
通过对您尝试做什么的更多解释,我们可以帮助您重组代码以使其更好地工作。