开发者社区> 杨俊明> 正文

python: 序列化/反序列化及对象的深拷贝/浅拷贝

简介: 一、序列化/反序列化 python中内置了很多序列化/反序列化的方式,最常用的有json、pickle、marshal这三种,示例用法如下: import json import pickle import marshal author1 = {"name": "菩提树下的杨过", "blog": "http://yjmyzz.
+关注继续查看

一、序列化/反序列化

python中内置了很多序列化/反序列化的方式,最常用的有json、pickle、marshal这三种,示例用法如下:

import json
import pickle
import marshal

author1 = {"name": "菩提树下的杨过", "blog": "http://yjmyzz.cnblogs.com/", "title": "架构师", "pets": ["dog", "cat"]}

# json序列化
json_str = json.dumps(author1)
print("json=>\n", json_str)

# json字符串反序列化
author2 = json.loads(json_str)

# pickle序列化
pickle_str = pickle.dumps(author1)
print("pickle=>\n", pickle_str)

# pickle字符串反序列化
author3 = pickle.loads(pickle_str)

# marshal序列化
marshal_str = marshal.dumps(author1)
print("marshal=>\n", marshal_str)

# marshal反序列化
author4 = marshal.loads(marshal_str)

print("\n",
      id(author1), "\n",
      id(author2), "\n",
      id(author3), "\n",
      id(author4), "\n",
      author1, "\n",
      author2, "\n",
      author3, "\n",
      author4)

with open("json.txt", "w") as file1:
    json.dump(author1, file1)

with open("pickle.txt", "wb") as file2:
    pickle.dump(author1, file2)

with open("marshal.txt", "wb") as file3:
    marshal.dump(author1, file3)  

输出:

json=>
 {"name": "\u83e9\u63d0\u6811\u4e0b\u7684\u6768\u8fc7", "blog": "http://yjmyzz.cnblogs.com/", "title": "\u67b6\u6784\u5e08", "pets": ["dog", "cat"]}
pickle=>
 b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x15\x00\x00\x00\xe8\x8f\xa9\xe6\x8f\x90\xe6\xa0\x91\xe4\xb8\x8b\xe7\x9a\x84\xe6\x9d\xa8\xe8\xbf\x87q\x02X\x04\x00\x00\x00blogq\x03X\x1a\x00\x00\x00http://yjmyzz.cnblogs.com/q\x04X\x05\x00\x00\x00titleq\x05X\t\x00\x00\x00\xe6\x9e\xb6\xe6\x9e\x84\xe5\xb8\x88q\x06X\x04\x00\x00\x00petsq\x07]q\x08(X\x03\x00\x00\x00dogq\tX\x03\x00\x00\x00catq\neu.'
marshal=>
 b'\xfb\xda\x04name\xf5\x15\x00\x00\x00\xe8\x8f\xa9\xe6\x8f\x90\xe6\xa0\x91\xe4\xb8\x8b\xe7\x9a\x84\xe6\x9d\xa8\xe8\xbf\x87\xda\x04blog\xfa\x1ahttp://yjmyzz.cnblogs.com/\xda\x05title\xf5\t\x00\x00\x00\xe6\x9e\xb6\xe6\x9e\x84\xe5\xb8\x88\xda\x04pets[\x02\x00\x00\x00\xda\x03dog\xda\x03cat0'

 4307564944 
 4309277360 
 4307565016 
 4309277432 
 {'name': '菩提树下的杨过', 'blog': 'http://yjmyzz.cnblogs.com/', 'title': '架构师', 'pets': ['dog', 'cat']} 
 {'name': '菩提树下的杨过', 'blog': 'http://yjmyzz.cnblogs.com/', 'title': '架构师', 'pets': ['dog', 'cat']} 
 {'name': '菩提树下的杨过', 'blog': 'http://yjmyzz.cnblogs.com/', 'title': '架构师', 'pets': ['dog', 'cat']} 
 {'name': '菩提树下的杨过', 'blog': 'http://yjmyzz.cnblogs.com/', 'title': '架构师', 'pets': ['dog', 'cat']}

注:api的方法名还是很好记的,dump/dumps意为“倒垃圾”,把对象向xxx里一倒,就算序列化完成了。反之load/loads即从字符串或文件中装载(还原)对象。特别要值得一提的是:pickle、marshal存在安全问题,如果装载的字符串或文件里,包含有精心设计的恶意代码,会让恶意代码执行(关于反序列化的漏洞,大家可以上网查一下,有很多类似的介绍)。另外从序列化后的字符串大小来看,默认情况下,就本示例而言,json序列化后的字符串长度最小,so,综合来看,推荐同学们使用json序列化/反序列化

 

二、深拷贝、浅拷贝

import copy

list_1 = [1, 2, 3, [4, 5]]

list_2 = copy.copy(list_1)  # 浅拷贝

list_3 = copy.deepcopy(list_1)  # 深拷贝

list_2[3][0] = 99

print("\n", list_1, "\n", list_2, "\n", list_3)

list_3[3][1] = 100

print("\n", list_1, "\n", list_2, "\n", list_3)

  输出:

 [1, 2, 3, [99, 5]] 
 [1, 2, 3, [99, 5]] 
 [1, 2, 3, [4, 5]]

 [1, 2, 3, [99, 5]] 
 [1, 2, 3, [99, 5]] 
 [1, 2, 3, [4, 100]]

  当一个对象里的子元素本身也是复杂元素时,浅拷贝不会为这种复杂的子元素生成全新的实例,但深拷贝可以。下面的内存分布示意图有助于

作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python的赋值引用, 浅拷贝和深拷贝
Python的赋值引用, 浅拷贝和深拷贝
21 0
【Python基础】对象的浅拷贝与深拷贝
【Python基础】对象的浅拷贝与深拷贝
42 0
Python中浅拷贝与深拷贝的骚操作
Python中浅拷贝与深拷贝的骚操作
21 0
高频面试题之Python深拷贝和浅拷贝
在Python中聊到深拷贝和浅拷贝这个问题就需要考虑Python的数据类型, 考虑到Python的数据类型就需要考虑变量的存储问题, 接下来我们从 变量, 对象, 引用的概念出发, 再到数据赋值操作, 延申到深浅拷贝, 循序渐进的梳理下!
129 0
深度解析Python的赋值、浅拷贝、深拷贝
直接赋值: 其实就是指向对象的引用(别名)。 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。但对于不可变数据类型,不会拷贝,仅仅是指向 深拷贝(deepcopy):`copy` 模块的 `deepcopy` 方法,完全拷贝了父对象及其子对象。 拷贝 就是把原数据复制一份,在复制的数据上随意改动不会影响到其原数据。也就是这里讲的深拷贝。
44 0
别再弄不清Python 深拷贝和浅拷贝了!
别再弄不清Python 深拷贝和浅拷贝了!
40 0
Python基础 面向对象的三大特征(封装、继承、多态)封装的实现方式、继承和多态、深拷贝和浅拷贝
python的面向对象的三大特征之一,封装。封装的实现方式 一:封装:提高程序的安全性 1.将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。
50 0
学习 Python 一年,这次终于弄懂了浅拷贝和深拷贝
话说,网上已经有很多关于 Python 浅拷贝和深拷贝的文章了,不过好多文章看起来还是决定似懂非懂,所以决定用自己的理解来写出这样一篇文章。
103 0
搞定面试之图解Python深拷贝浅拷贝
搞定面试之图解Python深拷贝浅拷贝
26 0
1_python进阶—浅拷贝、深拷贝
python进阶—浅拷贝、深拷贝
59 0
+关注
杨俊明
菩提树下的杨过 http://yjmyzz.cnblogs.com/
文章
问答
文章排行榜
最热
最新
相关电子书
更多
给运维工程师的Python实战课
立即下载
Python 脚本速查手册
立即下载
ACE 区域技术发展峰会:Flink Python Table API入门及实践
立即下载