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