关于使用matplotlib时变量作用域的困惑 -- 轴对象

1 投票
2 回答
1020 浏览
提问于 2025-04-26 18:17

我不知道为什么下面的代码能正常工作。如果我把主函数中的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

撰写回答