前言
在很多语言中都存在深浅拷贝两种拷贝数据的方式,Python中也不例外。本文中详细介绍了Python中的深浅拷贝的相关知识,文章的内容包含:
- 对象、数据类型、引用
- 赋值
- 浅拷贝
- 深拷贝
![ec6d8cde225052a032d45e21d23ed6e2.png](https://i-blog.csdnimg.cn/blog_migrate/360767c1b9c603744ffae11364e44343.jpeg)
一、Python对象
我们经常听到:在Python中一切皆对象。其实,说的就是我们在Python中构造的任何数据类型都是一个对象,不管是数字、字符串、字典等常见的数据结构,还是函数,甚至是我们导入的模块等,Python都会把它当做是一个对象来处理。
所有的Python对象都拥有3个属性:
- 身份
- 类型
- 值
我们看一个简单的例子来理解上面的3个属性:
假设我们声明了一个name变量,通过id、type方法能够查看对象的身份和类型:
![8d61d304e46d8c6a42bc8ff28415887a.png](https://i-blog.csdnimg.cn/blog_migrate/fb9a0a7ca1fe3e07955ead6ce3279f02.jpeg)
甚至是type本身也是一个对象,它也拥有自己的身份、类型:
![928442bd39f3aae7fb6432f105e5c8b7.png](https://i-blog.csdnimg.cn/blog_migrate/8e226c75989ca2cefcd7bbe6f3d17be0.jpeg)
Python中,万物皆对象
二、数据类型
2.1 可变和不可变类型
在Python中,按照更新对象的方式,我们可以将对象分为2大类:可变数据类型和不可变数据类型。
不可变数据类型:数值、字符串、布尔值。不可变对象就是对象的身份和值都不可变。新创建的对象被关联到原来的变量名,旧对象被丢弃,垃圾回收器会在适当的时机回收这些对象。
可变数据类型:列表、字典、集合。所谓的可变指的是可变对象的值可变,但是身份是不可变的。
首先我们看看不可变对象:
![af40df51b7ac28741a682c8846bb9478.png](https://i-blog.csdnimg.cn/blog_migrate/3246962f75680ca0eddb95d34181719c.jpeg)
当我们定义了一个对象str1,给其赋值了“python”,便会在内存中找到一个固定的内存地址来存放;但是,当我们将“python”定义成另一个变量名的时候,我们发现:它在内存中的位置是不变的。
![55a43b5a53b5190d854008603d95f4fd.png](https://i-blog.csdnimg.cn/blog_migrate/0041d4e8cd5f6548cff7cf13930fdafd.jpeg)
也就是说,这个变量在计算机内存中的位置是不变的,只是换了一个名字来存放,来看3个实际的例子:
![5f112d66905e935b9a93eb0e2fa944f1.png](https://i-blog.csdnimg.cn/blog_migrate/235bc83b08eb8e1d5b594b80d3064db7.jpeg)
![d144ae824c67d0113c84fc45f3afa7e1.png](https://i-blog.csdnimg.cn/blog_migrate/b33ebafef19f262bf200001e263dbd8b.jpeg)
![7d921afb84baa114c66b1fb25e9d1100.png](https://i-blog.csdnimg.cn/blog_migrate/e29c028dd35f17c139f9114e675f29da.jpeg)
以上的例子说明:当我们对字符串、数值型、布尔值的数据改变变量名,并不会影响到数据在内存中的位置。
我们看看可变类型的例子,列表、字典、集合都是一样的效果