我怎么能不缓存IPython变量?

时间:2017-03-24 13:15:53

标签: python ipython ipython-notebook

首次使用带字典的变量运行IPython块时,例如:

In[7]: test_dict = {'key_1': 1.8529757571664867,
                    'key_2': 1.551270403313663,
                    'key_3': 0.8213399558579995}

和功能:

In[8]: def rename_keys(inp_dict, add):
           for k, v in sorted(inp_dict.items()):
               inp_dict[k + add] = inp_dict.pop(k)
           return inp_dict

In[9]: rename_keys(test_dict, '_W')

IPython将打印预期结果:

Out[9]: {'key_1_W': 1.8529757571664867,
         'key_2_W': 1.551270403313663,
         'key_3_W': 0.8213399558579995}

但是,例如,如果我想改变#34; _W"到" _K",然后当我改变并重新启动块时,我得到了已经改变的结束+新结尾的旧变量:

In[10]: rename_keys(test_dict, '_K')

Out[10]: {'key_1_W_K': 1.8529757571664867,
          'key_2_W_K': 1.551270403313663,
          'key_3_W_K': 0.8213399558579995}

如何从头开始编写记事本运行代码?

  

当然,后来的调用意味着已经更改过的对象是合乎逻辑且显而易见的,但我是否可以这样做,以便在In [9]中更改它时,我有输出Out [9]

2 个答案:

答案 0 :(得分:2)

让rename_keys返回一个新对象,而不是更改旧对象:

def rename_keys(inp_dict, add):
    return {key + add: value for key, value in inp_dict.items()}

然后像

一样使用它
renamed = rename_keys(test_dict, '_W')

现在test_dict仍会包含原始密钥。

答案 1 :(得分:2)

这就是iPython的工作原理。单元格按照您运行它们的顺序执行 - 而不是按文档中的顺序执行。如果您想从头开始重新运行,可以致电cell->Run All Above

这里的理念是能够进行快速调试/原型设计,而不是编写顺序代码。