动态类型

对象是储存在内存中的实体。但我们并不能直接接触到该对象。我们在程序中写的变量,存储的是指向这一对象的引用。

引用和对象分离,是动态类型的核心。引用可以随时指向一个新的对象。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
>>> a = 'ABC'
>>> b = a
>>> a = 'XYZ'
>>> a,b

第一个赋值语句,引用 a 指向内存中的字符串对象 'ABC' 。

第二个赋值语句,引用 b 也指向对象 'ABC'  。

第三个赋值语句,引用 a 指向内存中的字符串对象 'XYZ' 。此时,引用 a 不再指向对象 'ABC' ,引用 b 仍指向对象 'ABC'  。

Python 动态类型 随笔 第1张

Python 动态类型 随笔 第2张

Python 动态类型 随笔 第3张

我们用内置函数 id() 来查看对象的内存地址:

>>> a = 'ABC'
>>> b = a
>>> id(a),id(b)
(63182768, 63182768)
>>> a = 'XYZ'
>>> id(a),id(b)
(64172360, 63182768)
>>> a,b
('XYZ', 'ABC')

我们再看另外一种情况:

>>> L1 = [1,2,3]
>>> L2 = L1
>>> L1[0] = 10
>>> L1,L2

Python 动态类型 随笔 第4张

Python 动态类型 随笔 第5张

>>> L1 = [1,2,3]
>>> L2 = L1
>>> id(L1),id(L2),id(L1[0]),id(L1[1]))
(56386184, 56386184, 8791156384592, 8791156384624)
>>> L1[0] = 10
>>> id(L1),id(L2),id(L1[0]),id(L1[1]))
(56386184, 56386184, 8791156384880, 8791156384624)
>>> L1,L2
([10, 2, 3], [10, 2, 3])

L1,L2的引用没有发生变化,依然指向那个列表对象。列表的元素 L1[0] 进行重新赋值操作,改变的是该元素对象的引用,对整个列表对象的引用没有影响。

能够改变对象自身,且存放对象的内存地址不会改变的数据类型,称为可变数据类型。包括列表、字典和集合。

不能改变对象自身,或改变对象自身后,存放对象的内存地址发生改变的数据类型,称为不可变数据类型。包括数字、字符串和元组。

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄