5

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

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

我在一个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
4

2 回答 2

5

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

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

例如:

global bar
bar = []
def foobar():
    bar.append('X')

实时调频:


关于 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]

这是另一个例子,它表明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']

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

于 2013-06-04T18:51:09.407 回答
2

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

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]
于 2019-04-21T17:05:30.087 回答