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中万物皆对象, 每个对象均包含以下三个属性:
  1. Identity—对象id,指在内存中的地址,又称为标识。可通过id(object)函数得到
  1. Type—所创建对象的类型。例如 int, list 。可通过type(object)函数得到
  1. Value—对象所保存的值。例如列表对象list=[1,2,3] 包含值1,2,3
📌
对象一旦被创建,其 ID 和 Type 便不能被修改,Value能否修改取决于对象类型。
根据对象中的Value是否可被修改,将Python中的对象分为了可变对象(Mutable Objects)和不可变对象(Immutable Objects)

2.List of Mutable and Immutable objects

Python内置类型对象的可变与不可变Python内置类型对象的可变与不可变
Python内置类型对象的可变与不可变
不可变对象int, float, complex, string, tuple, frozen set[note: immutable version of set], bytes 可变对象: list, dict, set, byte array
至于用户自定义类是否可变,完全取决于用户编写的代码

3.Non transitive nature of Immutability

不可变对象中包含着可变对象

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

可变对象中包含不可变对象

例,创建一个包含俩元组的列表
notion imagenotion image
所以,可变对象的值可变,不可变对象的值不可变。对嵌套对象,外层的不可变对象仅指其包含引用不可变,至于该引用所指的对象是否可变,取决于所指对象类型。
The “value” of an mutable object can change, but it’s constituent objects may can't.

4.Reference