Python中的浅拷贝与深拷贝

一、浅拷贝

浅拷贝是对于一个对象的顶层拷贝,通俗的理解是拷贝了引用,并没有拷贝内容,新变量与被拷贝变量指向同一个对象

1.“=”

a = [1,2]
b = a
print(id(a))
print(id(b))

打印结果:

2896016500104
2896016500104

  • 可以看出a和d的内存地址相同,所以a、b是同一个对象。
  • 浅拷贝仅拷贝了引用
二、深拷贝

深拷贝是拷贝了内容,而不是拷贝了引用

1. 内容拷贝“copy.deepcopy()”

import copy

a = [1,2]
b = [3,4]
c = [a,b] #注意,这里c里面是a、b
d = copy.deepcopy(c) #深拷贝
a.append(5)
print(id(c)) #id() 函数用于获取对象的内存地址
print(id(d))
print(c) #打印浅拷贝的内容
print(d) #打印深拷贝的内容

打印结果:

2519870268296
2519870268232
[[1, 2, 5], [3, 4]]
[[1, 2], [3, 4]]

  • 可以看出,c、d的内存地址不一样,c、d不是同一个对象。
  • 由于d在a添加5之前对c进行了全部内容的拷贝(即拷贝了c值、a值、b值),所以d等于a添加5之前c的内容。
  • 在deepcopy的时候,即便c换成元组,c和d的地址也不一样,所以这种方式的拷贝会深层的拷贝内容,会把所有的内容都拷贝下来。

2. 仅拷贝一层 “copy.copy()”

import copy

a = [1,2]
b = [3,4]
c = [a,b] #注意,这里c里面是a、b
d = copy.copy(c) #深拷贝,仅拷贝一层
a.append(5)
print(id(c)) #id() 函数用于获取对象的内存地址
print(id(d))
print(c) #打印浅拷贝的内容
print(d) #打印深拷贝的内容

打印结果:

2396509037448
2396509037384
[[1, 2, 5], [3, 4]]
[[1, 2, 5], [3, 4]]

  • 可以看出c、d的内存地址不一样,所以c、d不是同一个对象。
  • 由于d仅对c进行了一层拷贝(拷贝了c值、a引用、b引用),所以d中内容跟c中一样。

如果c是元组:

import copy

a = [1,2]
b = [3,4]
c = (a,b) #注意,这里c里面是a、b
d = copy.copy(c) #深拷贝,仅拷贝一层
a.append(5)
print(id(c)) #id() 函数用于获取对象的内存地址
print(id(d))
print(c) #打印浅拷贝的内容
print(d) #打印深拷贝的内容
打印结果:
2176493807496
2176493807496
([1, 2, 5], [3, 4])
([1, 2, 5], [3, 4])
  • 可以看出c和d的内存地址一样,说明c、d是同一个对象。
  • 由于对于元组这个不可变类型,仅拷贝一层没有意义,所以copy.copy的时候会判断被拷贝对象是否是可变类型,如果是不可变类型,仅相当于拷贝了引用(浅拷贝)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值