Python 可变对象 vs 不可变对象
date
Jun 2, 2021
slug
immutable_vs_mutable
status
Published
tags
Python
summary
The Mutable Objects and the Immutable Objects in Python
type
Post
1.Objects in Python
Python中万物皆对象, 每个对象均包含以下三个属性:
- Identity—对象id,指在内存中的地址,又称为标识。可通过
id(object)
函数得到
- Type—所创建对象的类型。例如 int, list 。可通过
type(object)
函数得到
- Value—对象所保存的值。例如列表对象
list=[1,2,3]
包含值1,2,3
对象一旦被创建,其 ID 和 Type 便不能被修改,Value能否修改取决于对象类型。
根据对象中的Value是否可被修改,将Python中的对象分为了可变对象(Mutable Objects)和不可变对象(Immutable Objects)
2.List of Mutable and Immutable objects

不可变对象: int, float, complex, string, tuple, frozen set[note: immutable version of set], bytes 可变对象: list, dict, set, byte array
至于用户自定义类是否可变,完全取决于用户编写的代码
3.Non transitive nature of Immutability
不可变对象中包含着可变对象
例:创建一个元组(不可变对象),里面包含两个列表(可变对象)

可见,尽管对象person是元组类型为不可变对象,但是person里面的列表可以被修改。这是因为这里我们没有改变Tuple中的对象引用,只是改变了被引用的对象值。通俗来讲,元组里面包含的子对象的
id
不可改,但id
所指的子对象的值能改(是否可改取决于子对象的类型)The “value” of an immutable object can’t change, but it’s constituent objects may can.
可变对象中包含不可变对象
例,创建一个包含俩元组的列表

所以,可变对象的值可变,不可变对象的值不可变。对嵌套对象,外层的不可变对象仅指其包含引用不可变,至于该引用所指的对象是否可变,取决于所指对象类型。
The “value” of an mutable object can change, but it’s constituent objects may can't.