python pickle 复原导致的变量关系丢失问题

运行 python 时,可以将当前的某些变量通过 pickle 序列化到二进制文件中;然后在需要时,再将这些变量还原,如以下代码:

import pickle
f = open("abc.pickle", 'wb+')
x = [1,2,3]
ls = [[(23, 29), (22, 79)], 'hello信息', '35',x]
num = 3.1415926
pickle.dump(ls, f)
pickle.dump(num, f)
pickle.dump(x, f)
print(id(x),id(ls[-1]))
x.append(1000)
print(x,ls)

这段代码会将变量 x、ls、num 三个变量存储到 abc.pickle 文件中。需要注意的是,ls 是个数组,它的最后一个元素指向另一个数组变量 x,即两者之间是有引用关系的。代码输出如下:

2481438571848 2481438571848
[1, 2, 3, 1000] [[(23, 29), (22, 79)], 'hello信息', '35', [1, 2, 3, 1000]]

然后通过以下代码还原这几个变量:

import pickle
f = open("abc.pickle", 'rb')
newls = pickle.load(f)
newnum = pickle.load(f)
x = pickle.load(f)
print(newls)
print(newnum)
print(x)
print("-------------")
print(id(x),id(newls[-1]))
x.append(10000)
print("x=",x,"nels=",newls)

这段代码运行结果如下:

[[(23, 29), (22, 79)], 'hello信息', '35', [1, 2, 3]]
3.1415926
[1, 2, 3]
-------------
1515710980488 1515710962440 # id 不同
x= [1, 2, 3, 10000] nels= [[(23, 29), (22, 79)], 'hello信息', '35', [1, 2, 3]]

从最初的输出看,三个变量的数值都被正常还原了,看起来是没有问题的;
在第一个代码中,x 与 ls 之间是有关系的,然而比对还原后的 newls 和 x,会发现,newsl 的最后一个元素其 id 与 还原后的 x 并不相同,两个已经分别指向了不同的区域,更新其中一个完全不影响另一个。这里是需要注意的,如果逻辑上有影响,可能需要用别的方式来解决这个问题。说实话,这种将变量导出再导入的方式,本身在不同的进程里边,虚拟内存地址肯定是变化的,所以根本没办法维持两者之间的关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值