Python 深浅拷贝使用与区别

什么是拷贝:

python 中拷贝是指创建一个新的对象,其中包含了原始对象的值,以便于在不改变原始对象的情况下进行操作。拷贝在处理数据时非常有用,特别是当我们需要对数据进行修改而又不想影响原始数据时。

2.浅拷贝

浅拷贝的规则如下: 被拷贝的对象如果是可变对象,则会生成新的对象,但仅是对可变对象外面壳子进行拷贝

不可变对象:如果被拷贝的对象是不可变对象,则不会生成新的对象。

可变对象: list set dict  

不可变对象: 数字  string tuple  

浅拷贝是指创建一个新的对象,改对象的深层内容是对原始对象中各项的引用

换句话说,浅拷贝只是复制了外面的壳子,里面的内容还是指向原来数据的内存地址。

案例: 

a = [1,2,3,[4,5,6],7,8,9] 

# 其中  1,2,3,7,8,9   就是我所说的外边的壳子   当我们使用c = a.copy() 生成的新的对象,只是复制了外面的壳子 1,2,3,7,8,9    ,其中像 [4,5,6]  和a中的[4,5,6] 指向同一个内存地址。

Python 深浅拷贝使用与区别_第1张图片 总结很到位 : 菜鸟编程

Python 深浅拷贝使用与区别_第2张图片 Python 深浅拷贝使用与区别_第3张图片

 浅拷贝拷贝了啥? 只是外边这个 list  '[        ]',    不信你看?

python  id() 函数的作用是返回对象的内存地址   同一个id 表示同一件东西

a = [1,2,3[4,5,6]]

b = a.copy()

id(a[1],a[3])

id(b[1],a[3])

Python 深浅拷贝使用与区别_第4张图片

 说明了啥? 说明了浅拷贝只是创建了新的对象,就像 b 一样,相对于a来说只是创建了新的对象,其内容是原来对象的引用,,里面的东西和a 所指的是一个东西。

随着不断深入python 学习  ,对于给变量赋值: 只是存在指针一样引用的东西。

a = [1,2,3]    有个盒子  装了 [1,2,3]  我给这个盒子贴了一个标签,这个标签名是  a  a 指向了这个盒子里面的[1,2,3] , 指向连接的关系我们可以把它称为引用。

可变对象的浅拷贝

在对,原对象浅拷贝后,无论是对原来可变对象还是经过浅拷贝后的对象的外部元素修改,也就是第一层元素修改,则相互不影响,但是如果是对深层次的元素做修改则相互影响

Python 深浅拷贝使用与区别_第5张图片

2 深拷贝:

深拷贝是拷贝了被拷贝对象的所有元素,包括嵌套元素,深拷贝出来的对象是一个全新的对象,不会与原来的对象之间有关系。

深拷贝我们需要使用     copy 模块中  deepcopy() 函数  

改变原有对象 并不会对新复制的对象产生影响

注意: 不可变对象不能被拷贝 不论是深拷贝还是浅拷贝

Python 深浅拷贝使用与区别_第6张图片

                                                          深拷贝

Python 深浅拷贝使用与区别_第7张图片

                                                               浅拷贝

可变对象的深拷贝

Python 深浅拷贝使用与区别_第8张图片

有的同学说,那可变对象浅拷贝的id() 返回对象的内存地址也是不一样啊

Python 深浅拷贝使用与区别_第9张图片

但是我们去看看可变对象内部的元素位置是否一致,我们要知道深拷贝后可变对象,不论是内部还是整个可变对象体,它们的 内存位置都是内存给新分配的,而不是引用。

Python 深浅拷贝使用与区别_第10张图片

翻车了? 按照理解来经过深拷贝的对象整个对象的内存地址都会被重新分配,而测试结果却是还是引用了原来元素

# 这个有待大家去思考我也很疑惑? 

我们为什么要用 id() 查看 对象的存储位置来看可变对象不可变对象 深拷贝与浅拷贝对对象的影响,因为id() 是查看对象在内存中的位置,如果产生了一个新的对象,也就是深拷贝,内存会为该新的对象分配位置,否则不会,如果我们通过  id()  函数查看对象的位置发生了变化即使深拷贝的影响,如果没变化则是浅拷贝的影响,但是还要注意浅拷贝中,可变对象与不可变对象,可变对象即是,对象中的元素可以被修改,不可变对象及对象中的元素,不能被修改

Python 深浅拷贝使用与区别_第11张图片


文章引用:Python中的赋值(复制)、浅拷贝与深拷贝 - 知乎 (zhihu.com)

作者:  高桌会

你可能感兴趣的:(python进阶,算法设计python语言,python)