如何在IPython中使用全局变量

时间:2013-06-04 18:25:58

标签: python ipython

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

2 个答案:

答案 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代码。

  1. 使用全局很可能意味着错误的工程。如果您需要全局,那意味着您需要重新设计代码。在python中更是如此。
  2. 当你真的想要使用全局(也许是唯一可接受的情况:单例,但在python中,你只会将单例的范围扩大到比使用它的地方更全局...) ,您需要将变量声明为全局变量,然后将其赋值为一个值。
  3. 例如:

      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']
    

    无论如何,全球性是邪恶的