一.变量的赋值
在python中,都是将“对象的引用(内存地址)”赋值给变量的。示例:
x = 3.14 y = x print(id(x)) print(id(3.14)) print(id(y))
运行结果:
在语句x = 3.14中,做了两件事:
第一步:创建了一个浮点型的对象。
第二步:将该对象的引用(“对象的引用”可以理解为对象的内存地址)赋值给名为x的变量,创建变量x(可以看到3.14,x的id(内存地址)都是一样的)。
注:
1.在Python中,每个变量在使用前都必须赋值,变量是在赋值的那一刻被创建的。
2.在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。
在语句y = x中,因为3.14这个对象之前已经创建了,所以这里其实只做一件事:
将对3.14这个对象的引用赋值给名为y的变量,创建变量y(可以看到3.14, x, y的id(内存地址)也是一样的).
有人喜欢把给变量赋值比喻成“贴标签”,把x, y这两个标签贴到3.14这个对象上。
二.可变对象 vs 不可变对象
可变对象:允许对自身进行修改;不可变对象:不允许对自身内容进行修改,如果修改了,那么它就不是原来的对象了——可以用id值判断。示例:
my_list:增加一个值后id不变,说明还是原来的对象。my_tuple无法操作修改。
Python3 中有六个标准的数据类型:
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
Python3 的六个标准数据类型中:
- 不可变数据类型(3 个):Number(数字)、String(字符串)、Tuple(元组);
- 可变数据类型(3 个):List(列表)、Dictionary(字典)、Set(集合)
注:bool(布尔)也是不可变数据类型。
四.浅拷贝 vs 深拷贝
1.原则
浅拷贝和深拷贝之间的区别只适用于容器对象(包含其他对象的对象,如列表或类实例)。
对于非容器对象没有区别,都是对象拷贝,相当于重新赋值,生成一个新的对象。
2.浅拷贝:引用拷贝
A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
上面是官方文档内容,主要包含两个意思:
(1)浅拷贝会创建一个新的容器对象(compound object)
(2)对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)。
(3)会产生浅拷贝效果的操作
- 使用切片[:]操作
- 使用工厂函数(如list/dir/set)
- 使用copy模块中的copy()函数
3.深拷贝:对象拷贝。
- A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.
上面是官方文档内容,主要包含两个意思:
(1)创建一个新的容器对象。
(2)对于对象中的元素,深拷贝都会重新生成一个新的对象。
参考资料
参考资料写得更详细,更好。
[1] 菜鸟教程-Python3 基本数据类型:http://www.runoob.com/python3/python3-data-type.html
[2]田小计划-图解Python深拷贝和浅拷贝:https://www.cnblogs.com/wilber2013/p/4645353.html
[3]python官方文档-内建类型:https://docs.python.org/3/library/stdtypes.html#dict
[4]python官方文档-拷贝:https://docs.python.org/3.7/library/copy.html