copy 复制对象,copy模块包含了两个行数copy和deepcopy,用于复制现有的对象。
浅副本(浅复制)
copy()创建的浅副本是一个新容器,其中填充了原对象内容的引用
import copy class MyClass: def __init__(self,name): self.name = name def __cmp__(self, other): return cmp(self.name,other.name) a = MyClass('a') my_list = [a] dup =copy.copy(my_list) #对于浅副本不会复制MyClass实例,所以dup列表中的引用会指向my_list相同的对象 print(my_list) print(dup) print(dup is my_list) print(dup == my_list) print(dup[0] is my_list[0]) print(dup[0] == my_list[0]) 结果: [<__main__.MyClass object at 0x000001E84E5B93C8>] [<__main__.MyClass object at 0x000001E84E5B93C8>] False True True True
deepcopy()创建的深副本(深复制)是一个新的容器,其中填充原对象的内容的副本
#dup =copy.copy(my_list) dup =copy.deepcopy(my_list) 结果 [<__main__.MyClass object at 0x0000028C5A7B93C8>] [<__main__.MyClass object at 0x0000028C5A8433C8>] False False False False
定制复制行为,可以使用特殊方法__copy__()和__deepcopy__()来控制如何建立副本。
pprint美观打印数据结构,用于生成数据结构的美观视图,便于人类阅读。
#打印 from pprint import pprint data = [(1,{'a':'A','b':'B','c':'C','d':'D'}), (2,{'e':'e','f':'f','g':'g','a':'A','b':'B','c':'C','d':'D','h':'h','i':'i','j':'j'}) ] #格式化一个对象,并把它写入到一个数据流,使用参数width调整格式化文本的宽度(默认为80),如果设置的宽度太小导致引起语法问题时候则不会再被截断 pprint(data,width=50) #限制嵌套的输出,对于非常深的数据结构,可能不需要输出所有细节,未包含层次使用...代替 pprint(data,depth=1) #递归 递归数据由指向原数据的引用来表示 from pprint import pprint local_data = ['n','a',1,2,3] local_data.append(local_data) pprint(local_data) 结果: [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'e', 'f': 'f', 'g': 'g', 'h': 'h', 'i': 'i', 'j': 'j'})] [(...), (...)] ['n', 'a', 1, 2, 3, <Recursion on list with id=2182885502024>]