Python假定变量是局部变量

Python假定变量是局部变量,python,ipython,global,local,Python,Ipython,Global,Local,首先,我会说这是一项任务,所需的行为不在我的控制之下。我正在创建一个名为globaltest.py的脚本,如果运行文件或调用文件中的函数,该脚本的作用应该完全相同。我在ipython做这两件事。它应该创建一个名为station_dict的字典,可以在ipython控制台中访问或使用whos命令查看该字典 from globaltest import file_to_dict file_to_dict() 当函数运行时,这将生成一个名为station_dict的变量 下面是脚本运行时的行为: R

首先,我会说这是一项任务,所需的行为不在我的控制之下。我正在创建一个名为globaltest.py的脚本,如果运行文件或调用文件中的函数,该脚本的作用应该完全相同。我在ipython做这两件事。它应该创建一个名为station_dict的字典,可以在ipython控制台中访问或使用
whos
命令查看该字典

from globaltest import file_to_dict
file_to_dict()
当函数运行时,这将生成一个名为station_dict的变量

下面是脚本运行时的行为:

Run globaltest
这还应该创建一个名为station_dict的字典

问题是调用和使用函数文件_to_dict不会创建变量,而只是运行该文件。这是我的密码。谢谢你的帮助

#!//bin/env python3

def main():

    global station_dict

    station_dict = {}

    station_dict['foo'] = 'bar'

def file_to_dict():

    global station_dict

    station_dict = {}

    station_dict['foo'] = 'bar'

if __name__ == '__main__':
    main()
以下是由于使用该函数而导致的不良输出:

Python 3.4.5 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:47:47)
Type "copyright", "credits" or "license" for more information.

IPython 5.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: from globaltest import file_to_dict

In [2]: file_to_dict()

In [3]: whos
Variable       Type        Data/Info
------------------------------------
file_to_dict   function    <function file_to_dict at 0x7f869f39cea0>
Python 3.4.5 | Continuum Analytics,Inc.|(默认,2016年7月2日,17:47:47)
有关详细信息,请键入“版权”、“信用”或“许可证”。
IPython 5.1.0——一种增强的交互式Python。
?         -> 介绍和概述IPython的功能。
%快速参考->快速参考。
帮助->Python自己的帮助系统。
对象?->有关“对象”的详细信息,请使用“对象??”获取更多详细信息。
在[1]中:从globaltest导入文件\u到\u dict
在[2]中:文件到dict()
在[3]:谁
变量类型数据/信息
------------------------------------
文件到目录功能
以下是运行程序后的良好输出:

Python 3.4.5 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:47:47)
Type "copyright", "credits" or "license" for more information.

IPython 5.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: run globaltest.py

In [2]: whos
Variable       Type        Data/Info
------------------------------------
file_to_dict   function    <function file_to_dict at 0x7fb92b7df8c8>
main           function    <function main at 0x7fb92b7df0d0>
station_dict   dict        n=1
Python 3.4.5 | Continuum Analytics,Inc.|(默认,2016年7月2日,17:47:47)
有关详细信息,请键入“版权”、“信用”或“许可证”。
IPython 5.1.0——一种增强的交互式Python。
?         -> 介绍和概述IPython的功能。
%快速参考->快速参考。
帮助->Python自己的帮助系统。
对象?->有关“对象”的详细信息,请使用“对象??”获取更多详细信息。
在[1]中:运行globaltest.py
在[2]:谁
变量类型数据/信息
------------------------------------
文件到目录功能
主要功能
电台广播n=1

这里发生了两件事:

  • Python所谓的“全局”并不是真正的全局,而是模块级(即在模块名称空间中)。因此,当您运行
    文件到dict
    时,
    站点dict
    将在
    全局测试的命名空间中设置,尽管该命名空间未绑定(即未导入),因此
    站点dict
    是不可访问的。要访问它,您可以执行以下操作:

    import globaltest
    globaltest.station_dict
    
  • IPython在解释器的命名空间中运行代码

  • 也就是说,我不知道如何实现你想要的。据我所知,函数不能在其调用的名称空间中设置变量,尽管这可能是通过使用诸如
    inspect
    之类的黑客工具实现的


    如果有帮助,您可以阅读。

    函数
    file\u to\u dict
    会修改/创建全局变量
    station\u dict
    。你需要提供某种证明它不存在的东西。当你试图描述你的“行为”时,比如
    运行一个9.[USERNAME]
    ,我不知道你的意思。你需要准确地说明你在做什么。首先,你在全球范围内没有任何名为
    station\u dict
    的字典!顺便问一下,为什么你要导入每个函数。导入应该是在外部进行的,它会更快。注意,
    run
    甚至不是真正以模块的形式运行某些东西,我很确定它只是提取源代码,并将其放在主命名空间中。这些东西是为了在shell环境中进行各种各样的恶作剧和原型设计而存在的,但它们并不适用于生产环境。您可以通过使用
    \uuuuu内置名称空间来获得“全局全局”,尽管这是非常粗糙的。在CPython中,修改调用方的名称空间通常是不可行的。您可能可以使用
    inspect
    访问调用者,但是,如果没有一些严重的黑客攻击,修改本地名称空间是不容易的,我从未见过这样做,但我不会说这是不可能的。