Python 动态类型
动态类型
对象是储存在内存中的实体,我们并不能直接接触到该对象。程序中的变量,是对象的一个引用。
引用和对象分离,是动态类型的核心。引用可以随时指向一个新的对象。
>>> a = 'ABC'
>>> b = a
>>> a = 'XYZ'
>>> a,b
-
a = 'ABC',引用 a 指向内存中的字符串对象 'ABC' 。
-
b = a,引用 b 也指向对象 'ABC' 。
-
a = 'XYZ',引用 a 指向内存中的字符串对象 'XYZ' 。
此时,引用 a 不再指向对象 'ABC',引用 b 仍指向对象 'ABC' 。可以通过内置函数 id() 查看对象的内存地址进行验证。
我们再看另外一种情况:
>>> L1 = [1,2,3]
>>> L2 = L1
>>> L1[0] = 10
>>> L1,L2
-
L1,L2的引用没有发生变化,依然指向那个列表对象。
-
列表元素 L1[0] 进行重新赋值操作,改变的是该元素对象的引用,对列表对象的引用没有影响。
-
能够改变对象自身,且存放对象的内存地址不会改变的数据类型,称为可变数据类型。包括列表、字典和集合。
-
不能改变对象自身,或改变对象自身后,存放对象的内存地址发生改变的数据类型,称为不可变数据类型。包括数字、字符串和元组。
浅拷贝和深拷贝
-
深拷贝指的是复制内容,单独开辟一个内存地址。
-
浅拷贝指的是两个变量同时指向一个内存地址。
>>> import copy
>>> x = [1,2,3]
>>> a = copy.copy(x) # 深拷贝
>>> x == a
True
>>> x is a
False
>>> y = '123'
>>> b = copy.copy(y) # 浅拷贝
>>> y == b
True
>>> y is b
True
>>> c = x[:] # 深拷贝