一、序列化/反序列化
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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。