【Python基础】之深浅拷贝

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])]为例

猜你喜欢

转载自blog.csdn.net/lincoco49/article/details/89362681