深拷贝、浅拷贝、数据类型

时间:2022-05-21 19:52:02

1、数据类型

(1)不可变类型

包括数值、字符串、元组

不可变指的是不能改变引用,只能放置一个新的引用

(2)可变类型

包括列表和字典

可变指的是当向列表或字典里面增删改时,引用没有受到影响
进一步解释可变与不可变,是指内存中的那块内容(value)是否可以被改变。如果是不可变类型,在对对象本身操作的时候,必须在内存中新申请一块区域(因为老区域是不可变的)。如果是可变类型,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(-/+)即可,也就是它的address会保持不变,但区域会变长或者变短。
可以使用內建函数id()来确定对象的身份在两次赋值前后是否发生了变化。
不可变类型有什么好处?
如果数据是不可变类型,当我们把数据传给一个不了解的API时,可以确保我们的数据不会被修改。如果我们要操作一个从函数返回的元组,可以通过內建函数list()把它转换成一个列表。(当被问到列表和元组的区别时,可以说这一点!)

2、深拷贝、浅拷贝

深浅拷贝都需要导入copy包:

import copy

(1)深拷贝

(类似“复制粘贴”操作)
层层拷贝,只拷贝内容,没有拷贝引用,意思是说把内容拷贝到一个新的引用,而不占用原来的引用
    a = [1,2,3,[4,5,6]]
b = copy.deepcopy(a)
b
[1,2,3,[4,5,6]]
a.append(7)
a
[1,2,3,[4,5,6],7]
b.append(8)
b
[1,2,3,[4,5,6],8]
b[3].append(9)
b
[1,2,3,[4,5,6,9],8]
a
[1,2,3,[4,5,6],7]

(2)浅拷贝(“快捷键”)

对最外层的拷贝,只拷贝引用,并没有拷贝内容,这也分数据类型的不同

1)可变类型:相当于深拷贝。拷贝一次的时候,将内容拷贝走了,放到一个新的容器去了
c = [1,2,3,4]
d = copy.copy(c)
d
[1,2,3,4]
id(c)
140266298283792
id(d)
140266297846672
2)不可变类型:拷贝引用,没有拷贝内容
e = '1234'
f = copy.copy(e)
id(e)
140266298318544
id(f)
140266298318544