1.首先介绍一个python的内置函数id()
- id()可以查看传入对象在内存中的地址。
- 在python中,对一些常用的数字或字符串,虽然变量名不同,但是为了节省内存,通常会共享同一个地址,如下代码示例:
# 变量a、b共用内存地址
a = 257
b = 257
print(id(a))#输出:1950671417040
print(id(b))#输出:1950671417040
2.拷贝:
- 当我们对变量a进行拷贝的时候,意味着在内存中开辟一块新的地址存放变量a的值。
- 对于str,int型的数据,无论深浅拷贝,返回的新变量都只是原变量的一个引用,而不会在内存中开辟新的地址。
- 对于其他类型的数据,浅拷贝指只对第一层的元素开辟新的地址,即数据的父亲层,对内层(子孙辈的层)还使用原来的地址。
- 深拷贝指除了最内存的元素使用原来的地址,其他层均在内存中开辟新的地址。
3.举例说明:
- str,int型数据: str型就不再举例,可见无论深浅拷贝,a,b,c都共享内存地址。
import copy
a = 123
#浅拷贝
b = copy.copy(a)
#深拷贝
c = copy.deepcopy(a)
print(id(a))# 输出:1543671728
print(id(b))# 输出:1543671728
print(id(c))# 输出:1543671728
import copy
a = [1, 2, [3, 4, 5], (6, [7, 8])]
#浅拷贝
b = copy.copy(a)
#第一层地址
print(id(a))# 输出:1854916189768
print(id(b))# 输出:1854916187912
#第二层地址
print(id(a[2]))# 输出:2532194133000
print(id(b[2]))# 输出:2532194133000
#第三层往后地址与第二层地址类似
import copy
a = [1, 2, [3, 4, 5], (6, [7, 8])]
#深拷贝
b = copy.deepcopy(a)
#第一层地址(不共享)
print(id(a))# 输出:1854916189768
print(id(b))# 输出:1854916187912
#第二层地址(不共享)
print(id(a[2]))# 输出:2694868837384
print(id(b[2]))# 输出:2694871380936
#.....中间层......
#最里层的地址(共享)
print(id(a[2][0]))#输出:1543667888
print(id(b[2][0]))#输出:1543667888
4.图解深浅拷贝:
- 以列表a = [1, 2, [3, 4, 5], (6, [7, 8])]为例