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)
前言:在过去的几个月里,这个答案被大大低估了。如果我的话可能看起来有点粗糙,我深表歉意,但我坚持认为全局变量确实有害,如下面链接的文档中所述。如果您考虑进一步拒绝此答案,请阅读文档并详细说明您不同意以下内容的原因。 引用下面链接的答案:“它们不好的原因是它们允许函数具有隐藏的(不明显的、令人惊讶的、难以检测的)副作用,从而导致复杂性增加,可能导致意大利面代码。 ”
例如:
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)
无论如何,全局变量是邪恶的!
除非列表在第一次调用时已经存在,否则追加和扩展将不起作用。预先声明它们也可以在笔记本中使用。
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)
| 归档时间: |
|
| 查看次数: |
26721 次 |
| 最近记录: |