目录:
引用:
"="是内存地址的赋值!
代码举例:
a=1
b=a
print(id(a))
print(id(b))
a=[1,2,3,4,5]
b=a
print(id(a))
print(id(b))
a=[1,2,3,4]
print(id(a))
结果:
140726028609328
140726028609328
2637243657536
2637243657536
2637243371840
可变数据类型与不可变数据类型
前置知识点:
下图详解:
数据类型分类:
代码举例:
对于不可变类型:
a=5
print(id(a))
a=6
print(id(a))
结果:
因为整数是不可变类型,所以当a的值改变后,a所指向的地址也发生了改变
140726028609456
140726028609488
对于可变数据类型(以列表为例)
a=[1,2,3,4,5,6]
print(id(a))
#将数字7加入列表
a.append(7)
print(id(a))
结果:
因为列表是可变数据类型,所以对列表进行操作后,a的指向也不会发生变化
2637243575424
2637243575424
浅拷贝
浅拷贝只拷贝父对象(一层),不会拷贝对象的内部的可变子对象(多层);
代码举例
a=[1,2,3,4,5]
b=a.copy()
print(b)
print(id(a),id(b))
结果:
浅拷贝只copy第一层,copy后的id不等于被copy数据的id
[1, 2, 3, 4, 5]
2637260084544 2637269459968
易错点:
a=[1,[1,2,3],2]
b=a.copy()
print(b)
#此时改变a的值
a[1][1]=6
print(a)
print(b)
结果:
b先浅拷贝a,当我们修改a列表里面嵌套的列表时会发现,b的值也叫修改了
这是因为,浅拷贝只能拷贝一层a[1]位置(嵌套列表)存放的是嵌套列表的引用,浅拷贝因为copy的是第一层,所以copy到嵌套列表时copy的不是具体的值,而是地址,所以当a里面的嵌套列表的值发生改变时,b的值也会发生改变。
[1, [1, 2, 3], 2]
[1, [1, 6, 3], 2]
[1, [1, 6, 3], 2]
深拷贝
深拷贝就是不管数据结构多么复杂,只要遇到可能发生改变的数据类型,就重新开辟一块内存空间把内容复制下来,直到最后一层.
深拷贝只能有copy模板实现
代码示例:
import copy
a=[1,[1,2,3],2]
b=copy.deepcopy(a)
a[1][1]=6
print(a)
print(b)
结果:
我们会发现,修改a嵌套列表里面的值,b嵌套列表的值并没有改变,因为是深copy,copy的是内容,不涉及引用,所以修改a的值,b的值并不会发生变化。
[1, [1, 6, 3], 2]
[1, [1, 2, 3], 2]
总结:
深浅拷贝图示如下:
可以登录下方网站进行代码动态演示:
https://pythontutor.com/
动态演示python代码的网站