Skip to content

Python 数据类型:可变与不可变

在 Python 中,数据类型可以分为两大类:可变数据类型不可变数据类型。理解它们之间的区别对于编写高效且无 bug 的 Python 代码至关重要。

什么是不可变数据类型?

不可变数据类型是指一旦创建,其值就不能被修改的数据类型。 任何尝试修改不可变对象的操作实际上都会创建一个新的对象。

Python 中常见的不可变数据类型包括:

  • int (整数):例如:10-50
  • float (浮点数):例如:3.14-2.50.0
  • complex (复数):例如:3 + 4j
  • bool (布尔值)TrueFalse
  • str (字符串):例如: "Hello""Python"
  • tuple (元组):例如: (1, 2, 3)
  • None (空值):表示没有任何值

你可能会疑惑,如果这些类型是不可变的,那我们平时修改变量的值是怎么做到的? 实际上,当我们对一个变量重新赋值时,并不是修改了原来的对象,而是在内存中创建了一个新的对象,然后将变量指向这个新的对象。 旧的对象如果没有被其他变量引用,就会被 Python 的垃圾回收机制回收。

示例:整数的不可变性

python
a = 10
print(f"a 的值: {a}, a 的内存地址: {id(a)}")

a = 20  # 重新赋值
print(f"a 的值: {a}, a 的内存地址: {id(a)}")

可以看到,当 a 的值从 10 变为 20 时,a 的内存地址也发生了变化。 这证明了 int 类型是不可变的。

示例:字符串的不可变性

字符串也是不可变的。 任何尝试修改字符串中字符的操作都会导致 TypeError 错误。

python
s = "Hello"
# s[0] = "J"  # 这行代码会报错:TypeError: 'str' object does not support item assignment

但是,我们可以通过重新赋值来创建一个新的字符串:

python
s = "Hello"
print(f"s 的值: {s}, s 的内存地址: {id(s)}")

s = "Jello" # 重新赋值
print(f"s 的值: {s}, s 的内存地址: {id(s)}")

同样,可以看到 s 的内存地址发生了变化。

什么是可变数据类型?

可变数据类型是指创建后其值可以被修改的数据类型。 修改可变对象的值不会创建新的对象,而是在原来的对象上进行修改。

Python 中常见的可变数据类型包括:

  • list (列表):例如: [1, 2, 3]
  • dict (字典):例如: {"name": "Alice", "age": 30}
  • set (集合):例如: {1, 2, 3}

示例:列表的可变性

python
l = [1, 2, 3]
print(f"l 的值: {l}, l 的内存地址: {id(l)}")

l[0] = 0  # 修改列表中的元素
print(f"l 的值: {l}, l 的内存地址: {id(l)}")

可以看到,即使修改了 l 中的元素,l 的内存地址仍然没有发生变化。 这证明了 list 类型是可变的。

示例:字典的可变性

python
d = {"a": "apple", "b": "boy"}
print(f"d 的值: {d}, d 的内存地址: {id(d)}")

d["c"] = "cat" # 添加新的键值对
print(f"d 的值: {d}, d 的内存地址: {id(d)}")

示例:集合的可变性

python
s = {"apple", "bat"}
print(f"s 的值: {s}, s 的内存地址: {id(s)}")

s.add("cat") # 添加新的元素
print(f"s 的值: {s}, s 的内存地址: {id(s)}")

总结

数据类型可变性示例
int不可变10, -5, 0
float不可变3.14, -2.5, 0.0
complex不可变3 + 4j
bool不可变True, False
str不可变"Hello", "Python"
tuple不可变(1, 2, 3)
None不可变None
list可变[1, 2, 3]
dict可变{"name": "Alice", "age": 30}
set可变{1, 2, 3}

理解可变和不可变数据类型对于编写高效、可预测的 Python 代码至关重要。 在编写函数时,需要特别注意参数的可变性,以避免意外修改原始数据。 例如,如果一个函数接受一个列表作为参数,并且修改了这个列表,那么调用者会发现原始列表也被修改了,这可能会导致意想不到的错误。