如何在ipython会话中从内存恢复变量值?

如何在ipython会话中从内存恢复变量值?,python,garbage-collection,ipython,Python,Garbage Collection,Ipython,一旦python变量被覆盖,您将如何从内存中恢复它 也许这会让事情变得容易一点。我目前正在进行ipython课程,如: In [1]: var = method_that_cant_be_reproduced() In [2]: var = [4, 5, 6] 是否有可能以某种方式恢复步骤1中分配给var的值?我想它还没有被垃圾收集 我还知道关于上一个值的一些细节。这是一个列表,我知道它的大小。根据文档“输入行4的结果可以作为Out[4]或_4”获得” 更多详细信息。我喜欢对它们进行pick

一旦python变量被覆盖,您将如何从内存中恢复它

也许这会让事情变得容易一点。我目前正在进行ipython课程,如:

In [1]: var = method_that_cant_be_reproduced()

In [2]: var = [4, 5, 6]
是否有可能以某种方式恢复步骤1中分配给
var
的值?我想它还没有被垃圾收集


我还知道关于上一个值的一些细节。这是一个列表,我知道它的大小。

根据文档“输入行4的结果可以作为Out[4]或_4”获得”


更多详细信息。

我喜欢对它们进行pickle处理,以便稍后检索-尤其是当我有一个类实例或一些在使用它进行测试时需要很长时间才能重新创建的东西时

import pickle

with open('pickled_var', 'wb') as picklefile:
    pickle.dump('asdf', picklefile)    

with open('pickled_var', 'rb') as picklefile:
    unpickled_var = pickle.load(picklefile)

print(unpickled_var)
asdf

在您的情况下,您可以在需要的值时对其进行pickle,然后加载“bad”变量以返回到“good”状态。

当您使用
var=[4,5,6]
时,名称
var
被反弹到一个新对象(列表)上,原始对象丢失(因为不再有任何名称引用它)。因为没有任何东西可以引用您的原始对象,所以您的问题的答案几乎肯定是

虽然这可能不是您想要的答案,但您可以从中学习以下几点:

  • 如果函数只能运行一次/变量只能生成一次,请不要覆盖它,在其他变量或文件中跟踪它
  • 尽量不要让一个变量只能生成一次(如果您的生成过程有问题,并且源代码丢失了怎么办?),在使用它之前复制一份源代码
  • 如果您的计算机已崩溃,您的IPython会话丢失,请预料意外情况?你把结果存储在任何地方了吗

所以你犯了一个错误,你仍然可以从中吸取教训,继续前进,知道你不会再犯同样的错误。

但是这两行中都没有输出。此外,它只是iPhyhon的一个特性,而不是Python的一个特性。我想人们可以在[1]中解析
。。。但这几乎是过度杀戮的定义。tl;博士:如果你认为你需要的话,保存你的VAR。你好,我认为如果答案是ipython特有的(因为这在问题标题中是明确的),那就好了。但是是的,_1只存储输出。我对变量的实际内容感兴趣。你说得对,对不起。实际上,您也可以访问输入缓存,请参见。因此,您可以访问[1]
中的
,在您的情况下,它将是一个字符串
“var=[1,2,3]”
,谢谢@lorenzotenti的提示。但不幸的是,事情并没有那么简单。我更新了这个例子,使之更接近现实。我错误地重写了变量,结果发现我真的需要原始内容,它们无法重新生成。是的,我期待着一个涉及一些记忆检查黑魔法或者一个隐藏的ipython功能的答案:)@NickA可能,我只是想知道是否有人会有我可以使用的技巧。正如我在问题中提到的,我假设它还没有被垃圾收集:)可能不起作用,但初步测试表明,我可以通过在控制台中使用
locals()
简单地调用一个值。它向我显示了函数调用和函数调用的返回值如果您没有进行初始
var=…
,结果仍然会被归档在
Out[1]
列表中。这是如何回答这个问题的?OP询问如何访问意外覆盖的值。如果您仍然可以访问该值,则无需对其进行pickle处理——只需将其存储在变量中,而不要覆盖它。如果您正在尝试使用变量进行新操作,并且不确定您将对其执行的操作是否会破坏它,则可以对其进行pickle处理并加载它。我经常对较大的数据集进行操作或设计新的修改,因为我不想等待20多分钟来回顾我创建原始变量的步骤,等等。这确实需要中间步骤,并花时间评估您处于良好状态的时间,但如果你把事情搞砸了,这是恢复到已知良好状态的有效方法。