在Python中,对象按可变属性可以分为可变对象和不可变对象两种。理解这两种对象的差异对于编写高效且易于维护的代码至关重要。本文将介绍Python中的可变对象和不可变对象,以及在使用它们时需要注意的事项。
1. 可变对象
Mutable objects can change their value but keep their id().
1.1 列表(list)
列表是Python中最常见的可变对象之一。列表中的元素可以是任意类型,包括数字、字符串、布尔值等。列表的创建非常简单,只需使用方括号[]即可。
列表具有很多实用的操作方法,如添加元素、删除元素、修改元素等。例如:
代码语言:javascript代码运行次数:0运行复制my_list = [1, 2, 3, 4, 5]
print(id(my_list))
# 添加元素
my_list.append(6)
print(my_list) # 输出:[1, 2, 3, 4, 5, 6]
print(id(my_list))
# 删除元素
my_list.remove(3)
print(my_list) # 输出:[1, 2, 4, 5, 6]
print(id(my_list))
# 修改元素
my_list[0] = 0
print(my_list) # 输出:[0, 2, 4, 5, 6]
print(id(my_list))1.2 字典(dict)
字典是Python中另一种常见的可变对象。字典是一种键值对(key-value)的数据结构,其中键(key)是唯一的,而值(value)可以是任意类型。字典的创建同样简单,只需使用大括号{}并在其中放置键值对即可。
字典也具有很多实用的操作方法,如添加键值对、删除键值对、修改键值对等。例如:
代码语言:javascript代码运行次数:0运行复制my_dict = {'name': '马一龙', 'age': 34, 'gender': 'male'}
print(id(my_dict))
# 添加键值对
my_dict['city'] = '深圳'
print(id(my_dict))
print(my_dict) # 输出:{'name': '马一龙', 'age': 34, 'gender': 'male', 'city': '深圳'}
# 删除键值对
del my_dict['gender']
print(id(my_dict))
print(my_dict) # 输出:{'name': '马一龙', 'age': 34, 'city': '深圳'}
# 修改键值对
my_dict['age'] = 35
print(id(my_dict))
print(my_dict) # 输出:{'name': '马一龙', 'age': 35, 'city': '深圳'}2. 不可变对象
An object with a fixed value. Immutable objects include numbers, strings and tuples. Such an object cannot be altered. A new object has to be created if a different value has to be stored. They play an important role in places where a constant hash value is needed, for example as a key in a dictionary.
2.1 元组(tuple)
元组是Python中的一种不可变对象。元组中的元素可以是任意类型,包括数字、字符串、布尔值等。元组的创建非常简单,只需使用圆括号()即可。
由于元组是不可变的,因此不能对其进行添加、删除或修改元素的操作。但是,可以使用切片(slicing)或指定索引的方式来访问元组中的元素。例如:
代码语言:javascript代码运行次数:0运行复制my_tuple = (1, 2, 3, 4, 5)
# 切片
print(my_tuple[1:4]) # 输出:(2, 3, 4)
#指定索引
print(my_tuple[2]) # 输出:32.2 字符串(str)
在Python中,字符串是不可变对象之一。字符串是由字符组成的序列,用于表示文本信息。创建字符串非常简单,只需使用单引号'或双引号"将字符括起来即可。
虽然字符串本身是不可变的,但我们可以通过切片(slicing)来获取字符串的子串,这实际上是创建了一个新的字符串对象。例如:
代码语言:javascript代码运行次数:0运行复制my_str = 'Hello, world!'
print(id(my_str))
sub_str = my_str[0:5] # 获取前5个字符
print(sub_str) # 输出:Hello需要注意的是,当我们对字符串进行切片操作时,会创建一个新的字符串对象,而不会修改原始字符串。这是因为字符串在Python中是不可变的,任何对字符串的操作都会生成一个新的字符串对象。
除了切片操作外,我们还可以使用字符串的一些常用方法来处理字符串,如拼接、替换、分割等。这些方法都不会修改原始字符串,而是返回一个新的字符串对象。例如:
代码语言:javascript代码运行次数:0运行复制# 字符串拼接
my_str = my_str + ' Python'
print(id(my_str))
print(my_str) # 输出:Hello, world! Python
# 字符串替换
new_str = my_str.replace('Python', 'PyPI')
print(new_str) # 输出:Hello, world! PyPI
# 字符串分割
words = my_str.split(' ')
print(words) # 输出:['Hello,', 'world!', 'Python']参考:
https://docs.python.org/3/glossary.html#term-immutablehttps://docs.python.org/3/glossary.html#term-mutable
相关阅读:
Python 如何克隆一个列表,使它不会在赋值后发生意外变化?
如何在迭代时从 python 列表中删除元素?Python 数据结构之 dictionaryPython 数据结构之 tuple理解Python的浅拷贝和深拷贝