使用matplotlib - 轴对象混淆变量范围

时间:2014-10-10 08:52:19

标签: python matplotlib

我不知道为什么以下代码有效。如果我在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()

2 个答案:

答案 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