栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 并不相同,两个已经分别指向了不同的区域,更新其中一个完全不影响另一个。这里是需要注意的,如果逻辑上有影响,可能需要用别的方式来解决这个问题。说实话,这种将变量导出再导入的方式,本身在不同的进程里边,虚拟内存地址肯定是变化的,所以根本没办法维持两者之间的关系。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923452.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号