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
答案 0 :(得分:0)
除非列表在首次被调用时已经存在,否则追加和扩展将不起作用。预先声明它们也可以在笔记本中使用。
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]
答案 1 :(得分:-1)
前言:在过去的几个月里,这个答案被大大降低了。我道歉,如果我的话似乎有点粗糙,但我坚持认为全局变量确实有害,正如下面链接的文档中所解释的那样。如果您考虑进一步低估这个答案,请阅读文档并详细说明您不同意以下内容的原因。 引用下面链接的答案:“他们不好的原因是他们允许函数隐藏(非显而易见,令人惊讶,难以察觉)的副作用,导致复杂性增加,可能导致Spaghetti代码。“
例如:
global bar
bar = []
def foobar():
bar.append('X')
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]
这是另一个例子,显示全局确实有效,而不是外部范围:
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']
无论如何,全球性是邪恶的!