你想要实现的目标有很多问题,除非你故意设置一个自我修改的代码系统,它看起来不像你。
1. 全局变量
spam = 100
def set_spam(value):
spam = value
foo = reload(foo) #reload module from itself
这是行不通的。由于 Python 闭包的工作方式,您的spam = value行将在您的函数中创建一个新的局部变量,然后不会被使用。要正确更改 global 的值,您必须使用关键字,例如:spamset_spamspamglobal
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
通过对您尝试做什么的更多解释,我们可以帮助您重组代码以使其更好地工作。