别名、浅复制与深复制

别名

别名就是起另一个名字,实际上是同一个东西,地址完全一样,改变任意一个的值,另一个会随着改变。

person_info = ['age: 18', ['beijing', 'wuhan']]
info_other_name = person_info  # 别名,他们是在同一个地址上,改变任意一个,另外的跟着改变(可以减少不必要的内存开销)
print id(info_other_name), id(person_info)  # 地址一样
person_info[0] = 'age: 23'  # 改变原地址年龄,info_other_name也跟着变,因为就是一个东西
print u'原来的值', person_info
print u'别名的值', info_other_name

 

输出结果

47750200 47750200
原来的值 ['age: 23', ['beijing', 'wuhan']]
别名的值 ['age: 23', ['beijing', 'wuhan']]

 

浅复制

浅复制表示只复制表面一层,再深的层次还是指向他原来的地址。

import copy
person_info = ['age: 18', ['beijing', 'wuhan']]
info_shallow_copy = copy.copy(person_info)  # 浅复制 只复制第一层,其他层还是指向它原来的地址
print id(info_shallow_copy), id(person_info)  # 地址不一样
person_info[0] = 'age: 23'  # 此处改年龄,person并没有跟着改变
person_info[1].remove('wuhan')  # 删除列表里的下一级列表,会跟着改变
print u'原来的值', person_info
print u'浅复制的值', info_shallow_copy

输出结果

47791200 47769360  # 地址不一样
原来的值 ['age: 23', ['beijing']] 
浅复制的值 ['age: 18', ['beijing']]  # 表面上的一层(年龄),独立于原来的值,但往下一层指向的地址还是原来的指向

 

深复制

深复制之后,所有的内容都独立于原变量存在。

import copy
person_info = ['age: 18', ['beijing', 'wuhan']]
info_deep_copy = copy.deepcopy(person_info)  # 深复制 全部都都复制过来,都不会跟着改变
print id(info_deep_copy), id(person_info)  # 地址不一样
person_info[0] = 'age: 23'
person_info[1].remove('wuhan')
print u'原来的值',person_info
print u'深复制的值',info_deep_copy

输出结果

54781712 54859536
原来的值 ['age: 23', ['beijing']]
深复制的值 ['age: 18', ['beijing', 'wuhan']]  # 完全独立于原来的变量

 

posted @ 2018-03-08 21:38  花花12  阅读(285)  评论(0编辑  收藏  举报