我不知道为什么以下代码有效。如果我在main中注释掉ax分配,它就会停止工作。 ax如何进入函数范围?这是python版本2.7.2。
经过一番研究后,我发现在同一代码模块中定义的函数会看到 main 块中的所有变量。我不知道python是这样工作的! 主块中的每个变量对同一源文件中的所有函数都是可见的。这并不是我所希望的!它似乎违反了什么功能。我想这个例外是针对主代码块的,但我不会猜到它。
如何阻止此代码模块中定义的函数查看主块中的所有变量?
import pylab as plt
def f():
ax.plot([1],[2]) # How is this ever defined?
return
if (__name__ == "__main__"):
fig = plt.figure()
plt.clf()
ax = plt.subplot(111,polar=True) # If I comment this out, then ax is not defined error in function call
plt.hold(True)
f()
答案 0 :(得分:2)
“这不会让我觉得可取!它似乎违反了什么功能。”
然后,您应该避免在代码中使用全局变量。请注意,您所指的主要块是(该模块/脚本的)全局命名空间。有一个if语句,但这并不意味着“主”块突然变成了一个特殊功能。
你可以做的就是这个(通常认为它更好):
import pylab as plt
def f():
ax.plot([1],[2]) # This is now never defined
return
def main():
fig = plt.figure()
plt.clf()
ax = plt.subplot(111,polar=True) # ax is now local to the main() function only.
plt.hold(True)
f()
if __name__ == "__main__": # No parentheses for an if-statement; very un-Pythonic
main()
现在,每次都会导致错误,因为ax
仅在main()
内定义,而不是在全局(模块)命名空间中定义。
答案 1 :(得分:0)
你不会,因为python中的函数总是可以访问全局命名空间,这是它们模块的命名空间。
您可以使用模块隔离功能。
只需在模块中定义您的功能,即mymod.py
之类的文件。它只能访问其模块范围。然后,您可以在myscript.py
中将其用作
#file myscript.py
from mymod import myfunction
#and now the function myfunction will not 'see' the variables defined in myscript.py