Python笔记——赋值,浅拷贝,深拷贝

Python笔记——赋值,浅拷贝,深拷贝

我们知道对于任何一种编程语言来说,赋值,浅拷贝,深拷贝问题作为程序员来说都是必须要注意的问题(容易出现隐藏bug),最近又重新看了一下关于python中深浅拷贝的问题,故打算总结一下。

1.赋值

在python中,变量的赋值即将一个变量的值赋给另一个变量,其实就是将这两个变量指向同一个内存地址。

因此,如果这个变量的值变了,那么另一个变量的值也会跟着改变,因为它们的内存地址始终相同。

举例:

#input
list_1 = [1, 2, 3, ['n', 'b']]
list_2 = list_1
print(list_1 == list_2)
print(list_1 is list_2)
print(id(list_1))
print(id(list_2))

#output
True
True
140609474162248
140609474162248

2.浅拷贝

浅拷贝是创建了一个具有相同类型,相同值,但id不同的新对象。浅拷贝仅仅是对对像本身创建了一份拷贝,而没有进一步处理对象包含的子对象值(例如,列表,字典等子对象)。即浅拷贝对子对象不起作用,所以浅拷贝使用的场景是:对象自身发生改变的同时需要保持对象中的值完全相同。比如list排序,举例(需要import copy):

#input
import copy
list_1 = [1, 2, 3, ['n', 'b']]
list_2 = copy.copy(list_1) #or list_2 = list_1.copy()
print(list_1 is list_2)
print(id(list_1))
print(id(list_2))

list_1.append(4)
print(list_1, list_2)
list_1[3].append('nb')
print(list_2)
print(list_1 is list_2)
print(list_1[3] is list_2[3])


#output
False
140362957102920
140362957103048
[1, 2, 3, ['n', 'b'], 4] [1, 2, 3, ['n', 'b']]
[1, 2, 3, ['n', 'b', 'nb']]
False
True

3.深拷贝

深拷贝不仅仅拷贝原始对象自身,也会对其包含的值进行拷贝,即它会递归地查找对象中包含的其他对象的引用来完成更深层次的拷贝。拷贝完成后,两个对象完全的独立,互不影响(浅拷贝中对象中子对象的值会产生影响)。因此,深拷贝可以随意修改不用担心会对原始值改变。

#input
import copy
list_1 = [1, 2, 3, ['n', 'b']]
list_2 = copy.deepcopy(list_1)
print(list_1 is list_2)
print(id(list_1))
print(id(list_2))

list_1.append(4)
print(list_1, list_2)
list_1[3].append('nb')
print(list_1, list_2)
print(list_1 is list_2)
print(list_1[3] is list_2[3])

#output
False
140326007037640
140326007652104
[1, 2, 3, ['n', 'b'], 4] [1, 2, 3, ['n', 'b']]
[1, 2, 3, ['n', 'b', 'nb'], 4] [1, 2, 3, ['n', 'b']]
False
False

总结:

赋值的方式就相当于给内存中同一地址中的值起了两个不同的名字,无论改变谁都会对值产生影响

浅拷贝的方式是,对象中的子对象相互影响,其余部分互不影响

深拷贝的方式是,对象中所有的内容均互不影响

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值