不管怎么拷贝,都是复制原数据产生一个新的数据并且将新数据的地址返回
p1 = Person('小明') print('p1:', p1) # p1: <'name': '小明', 'age': 0, 'gender': '女', 'dog': None, id:35314312> p3 = copy(p1) p4 = deepcopy(p1) print('p3:', p3) # p3: <'name': '小明', 'age': 0, 'gender': '女', 'dog': None, id:35320904> print('p4:', p4) # p4: <'name': '小明', 'age': 0, 'gender': '女', 'dog': None, id:35321096>**直接赋值:**其实就是对象的引用(别名)。
**浅拷贝(copy):**拷贝父对象,不会拷贝对象的内部的子对象。
深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
1. 浅拷贝
copy模块里面的copy方法实现。浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象;改变原始对象中为不可变类型的元素的值,不会响拷贝对象。
2. 深拷贝
copy模块里面的deepcopy方法实现。深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。经过深拷贝后,原始对象和拷贝对象所有的可变元素地址都没有相同的了。
print('=================浅拷贝=================') p1 = Person('Tom', 18, '男') p1.dog = Dog('大黄', '黄色') print('p1:', p1) # p1: <'name': 'Tom', 'age': 18, 'gender': '男', 'dog': <__main__.Dog object at 0x00000000021DDD08>, id:35518152> # 浅拷贝 p2 = copy(p1) print('p2:', p2) # p2: <'name': 'Tom', 'age': 18, 'gender': '男', 'dog': <__main__.Dog object at 0x00000000021DDD08>, id:35683208> p2.dog.color = '绿色' print(p1.dog.color) # 绿色 print('================深拷贝====================') p1 = Person('Tom', 18, '男') p1.dog = Dog('大黄', '黄色') print('p1:', p1) # p1: <'name': 'Tom', 'age': 18, 'gender': '男', 'dog': <__main__.Dog object at 0x00000000027E27C8>, id:41917640> # 深拷贝 p2 = deepcopy(p1) print('p2:', p2) # p2: <'name': 'Tom', 'age': 18, 'gender': '男', 'dog': <__main__.Dog object at 0x0000000002806C88>, id:41970376> p2.dog.color = '绿色' print(p1.dog.color) # 黄色内存管理:
python内存管理是自动化(指的是对堆上的内存进行管理)
内存的开辟
只要需要保存数据的时候系统就会自动在堆上开辟内存空间保存数据。
注意:如果需要被保存的数据是数字或者字符串,系统会先检查专门保存数字字符串的的缓存区中是否已经存在这
个数据,如果存在直接返回之前的数据的地址,不存在才会开辟新的内存去保存。(短小数字和字符串)
str1 = 'abc' list1 = ['abc', 10, 20] print(id(str1), id(list1[0])) # 4468066352 4468066352 list2 = [] list3 = [] print(id(list2), id(list3)) # 4467411936 4468530144 num1 = -6 num2 = -6 print(id(-6), id(-6)) # 31630224 31630224 内存的释放(垃圾回收)Python中的每一个数据都有一个属性用来保存这个数据的引用个数(引用计数),当引用计数的值为0,那么这个数据就会自动销毁。实际上会有短暂的延迟,人感觉不到。
print(f’{address[0]}:{re_data.decode()}’) if re_data.decode() == ‘拜拜’: break
message = input('>>>') connect.send(message.encode()) if message == '拜拜': break