如何在 IPython 中使用全局变量

use*_*979 4 python ipython

IPython 如何处理局部变量?我有这个函数在 Python shell 中工作,但在 IPython shell 中不起作用。

def change(key,value):
    global aname
    global alist
    alist.append(key)
    aname.extend(value)
Run Code Online (Sandbox Code Playgroud)

我在for循环中使用它,它从 JSON 和其他 .txt 文件中读取输入,并将键和值添加到列表中,然后由另一个函数使用以保存到数据库。如果我不这样做,它将很难看,并且会在我的循环中使用索引。

[change(key,value) for key,value in jsondata.itervalues()]

def storeindatabase():
    do_sothing to the list aname and store
    do_sothing to the alist and store
Run Code Online (Sandbox Code Playgroud)

zmo*_*zmo 6

前言:在过去的几个月里,这个答案被大大低估了。如果我的话可能看起来有点粗糙,我深表歉意,但我坚持认为全局变量确实有害,如下面链接的文档中所述。如果您考虑进一步拒绝此答案,请阅读文档并详细说明您不同意以下内容的原因。 引用下面链接的答案:“它们不好的原因是它们允许函数具有隐藏的(不明显的、令人惊讶的、难以检测的)副作用,从而导致复杂性增加,可能导致意大利面代码。

  1. 使用全局变量很可能意味着错误的工程。如果你需要一个全局变量,那就意味着你需要重新设计你的代码。在python中更是如此。
  2. 当您确实想使用全局变量时(可能是唯一可接受的情况:单例,尽管在 python 中,您只能将单例的范围比使用它的位置更全局……),您需要将变量声明为全局变量,然后赋予它一个值。

例如:

global bar
bar = []
def foobar():
    bar.append('X')
Run Code Online (Sandbox Code Playgroud)

RTFM:


关于 IPython 部分,我的示例确实有效:

In [1]: global bar

In [2]: bar = []

In [3]: def foo():
   ...:     bar.append(3)
   ...:     

In [4]: foo()

In [5]: foo()

In [6]: foo()

In [7]: bar
Out[7]: [3, 3, 3]
Run Code Online (Sandbox Code Playgroud)

这是另一个例子,它表明global确实有效,而不是外部范围:

In [2]: def foo():
   ...:     global bar
   ...:     bar = []
   ...:     

In [3]: def oof():
   ...:     bar.append('x')
   ...:     

In [4]: foo()

In [5]: oof()

In [6]: oof()

In [7]: oof()

In [8]: oof()

In [9]: bar
Out[9]: ['x', 'x', 'x', 'x']
Run Code Online (Sandbox Code Playgroud)

无论如何,全局变量是邪恶的

  • iPython 笔记本通常用于修补新问题。在这种情况下使用全局变量没有任何问题。这不是关于编写优美的代码,而是关于为什么@user1940979 给出的特定案例不起作用。 (29认同)
  • 我认为使用“global”没有任何问题。我认为你是精英主义者。我一直在我的 PHP 代码中这样做,一个叫 Adrian 的朋友告诉我这很好。 (9认同)
  • @zmo,没有人在 IPython 中进行真正的编程。IPython 用于研究和原型设计。 (3认同)
  • 我强烈不同意你的说法,即它“几乎从来没有用过”这是专门在 IPython shell 中使用全局变量。在进行探索和快速原型设计时使用全局变量是完全合理且极其有用的。我发现你的帖子完全没有帮助(它甚至不起作用)而且非常冒昧。 (2认同)

beh*_*old 6

除非列表在第一次调用时已经存在,否则追加和扩展将不起作用。预先声明它们也可以在笔记本中使用。

aname=[]
alist=[]
def change(key,value):
    global aname
    global alist
    alist.append(key)
    aname.extend(value)

change(3,[3])
print(alist)
[3]
print(aname)
[4]
Run Code Online (Sandbox Code Playgroud)