关于使用matplotlib时变量作用域的困惑 -- 轴对象
我不知道为什么下面的代码能正常工作。如果我把主函数中的ax赋值注释掉,它就不再工作了。ax是怎么在这个函数的作用范围内的?这是Python 2.7.2版本。
经过进一步的研究,我发现同一个代码模块中定义的函数可以看到主块里的所有变量。我之前不知道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()
2 个回答
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()
内部定义,而不在全局(模块)命名空间中。
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