三.深浅copy
调用方法:
import copy #浅拷贝
copy.copy()
深拷贝
copy.deepcopy() #赋值
1. 对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
举例:
import copy
#字符串,数字
a1 = ‘adddddd‘
a2 = ‘12322‘
a2 = a1
print(id(a1))
print(id(a2))
a3 = copy.deepcopy(a1)
print(id(a1))
print(id(a3))
输出结果:
41923448
41923448
41923448
41923448
2.赋值,只是创建一个变量,该变量指向原来内存地址,对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同
2.1. 对于浅拷贝
import copy
list_a = [1,2,3,"hello",["python","C++"]]
list_b = list_a
list_b = copy.copy(list_a)
list_c = copy.deepcopy(list_a)
list_b.append([4,5])
print(list_a)
print(list_b)
list_a[4].append("C")
print(list_a)
print(list_b)
print(list_c)
输出结果:
C:\Python34\python.exe E:/Python/S12/day1/test1.py
[1, 2, 3, ‘hello‘, [‘python‘, ‘C++‘]]
[1, 2, 3, ‘hello‘, [‘python‘, ‘C++‘], [4, 5]]
[1, 2, 3, ‘hello‘, [‘python‘, ‘C++‘, ‘C‘]]
[1, 2, 3, ‘hello‘, [‘python‘, ‘C++‘, ‘C‘], [4, 5]]
[1, 2, 3, ‘hello‘, [‘python‘, ‘C++‘]]
list_a和list_b是不同的对象,修改list_b理论上不会影响list_a。比如list_b.append([4,5])。
但是要注意,浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在list_a中有一个嵌套的list,如果我们修改了它,查看list_b,将发现list_b也发生了变化。这是因为,你修改了嵌套的list。修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并为发生变化,指向的都是同一个位置。
非常重要的结论:修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并未发生变化,指向的都是同一个位置。
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因而,它的时间和空间开销要高。 同样对list_a,若使用list_b = copy.deepcopy(list_a),再修改list_b将不会影响到list_a了。即使嵌套的列表具有更深的层次,也不会产生任何影响,因为深拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何关联。
例子:
dic = {
"cpu":[80,],
"men":[80,],
"disk":[80,],
}
print(‘brefore‘,dic)
new_dic = copy.copy(dic)
new_dic[‘cpu‘][0] = 50
print(dic)
print(new_dic)
new_dic = copy.deepcopy(dic)
new_dic[‘cpu‘][0] = 30
print(‘2‘,dic)
print(‘2‘,new_dic)
输出结果:
C:\Python34\python.exe E:/Python/S12/day3/s2.py
brefore {‘cpu‘: [80], ‘men‘: [80], ‘disk‘: [80]}
{‘cpu‘: [50], ‘men‘: [80], ‘disk‘: [80]}
{‘cpu‘: [50], ‘men‘: [80], ‘disk‘: [80]}
2 {‘cpu‘: [50], ‘men‘: [80], ‘disk‘: [80]}
2 {‘cpu‘: [30], ‘men‘: [80], ‘disk‘: [80]}