代码之家  ›  专栏  ›  技术社区  ›  James Wright user3667089

全局变量无法从ipython中的模块函数工作

  •  3
  • James Wright user3667089  · 技术社区  · 8 年前

    我肯定有人已经回答了这个问题,但我找不到。

    我有一个剧本 test.py 存在的唯一目的是放置变量 var 进入全局命名空间:

    def test():
        global var
        var = 'stuff'
    

    下面是我跑步时发生的事情 测验py公司 在ipython中使用 %run ,然后运行 test() ,然后尝试访问 风险值 。

    Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]
    Type 'copyright', 'credits' or 'license' for more information
    IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
    
    In [1]: %run test.py
    
    In [2]: test()
    
    In [3]: var
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-3-84ddba356ca3> in <module>()
    ----> 1 var
    
    NameError: name 'var' is not defined
    
    In [4]:
    

    知道发生了什么吗?或者通常如何将其引入本地名称空间?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Eugene Yarmash    8 年前

    这个 %run 命令创建 单独的命名空间 用于文件中的全局变量。它还会在执行后使用文件中定义的所有变量更新IPython交互式命名空间。因此,您可以在脚本中调用函数,以便在文件完成执行之前创建全局变量:

    def test():
        global var
        var = 'stuff'
    test()
    

    或使用 %run -i :

    -i 在IPython的命名空间中运行该文件,而不是空文件。如果您正在试验在文本编辑器中编写的代码,这将非常有用 这取决于交互定义的变量。

        2
  •  2
  •   Auzy    8 年前

    使用 %run -i test.py 这将在交互式命名空间中运行它,并允许您访问全局变量。

    In [1]: %run -i test.py
    
    In [2]: test()
    
    In [3]: var
    Out[3]: 'stuff'