厘清 Python 的序列类型

厘清 Python 的序列类型

本文内容还是来自《流畅的 Python》这本书,当我读到 tuple 是不可变序列的时候,突然意识到我先前的理解都是错的啊!

可变序列和不可变序列

在我先前的理解中,几乎就是把 tuplelist 一样的在使用,当然他们的确有很多的共同点,但唯一的区别是,tuple 的元素一旦确定就不可以改变了。下面让我们来和「可变序列 list」对比一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
# tuple
tuple_data = (1, 2, 3)
tuple_data[0] = 0
# Traceback (most recent call last):
# File "<input>", line 1, in <module>
# tuple_data[0] = 0
# TypeError: 'tuple' object does not support item assignment

# list
list_data = [1, 2, 3]
list_data[0] = 0
print(list_data)
# [0, 2, 3]

上文中,我们想对序列的第一个元素进行修改,tuple 会直接告诉你不可以这样做(即没有元素的 set 方法),而 list 可以。

在是否可变的理解上有一个误区,就是把「变量的可变」误以为是「tuple 可变」,这也正是我误解的地方。

1
2
3
4
5
6
tuple_data = (1, 2, 3)
print(tuple_data)
# (1, 2, 3)
tuple_data = (0, 1, 2)
print(tuple_data)
# (0, 1, 2)

所以不可变序列的不可变是指序列中的元素不可变!像这样的数据类型还有 strbytes

扁平序列和容器序列

下面我们要说另外一种序列的划分方法,根据序列中存放的元素类型进行划分,不过它们的概念就相对比较简单,我来举个例子吧。

一般家里都会囤一些鸡蛋,以补充日常所需蛋白质,比如可以做番茄炒蛋,肉末蒸蛋、蛋炒饭等。你有没有发现存放鸡蛋的盒子,它非常特殊,刚刚能把鸡蛋固定住,由于表面不平整且容积较小,一般放不了别的东西。这个就是我们的「扁平序列」啦~它只能存放一种特定的数据类型,比如 strbytes 等。

其次,家里还会有一些大碗,它的容积很大,既可以用来盛米饭,或者盛红烧肉,而且还能盛半碗红烧肉和半碗米饭,非常好用!这种可以放入不同类型的容器,就是「容器序列」,比如有 listtuple 等。

我们来看下具体的代码:

1
2
3
4
5
6
7
8
9
# str
str_data = str("123")
print(str_data)
# 123

# list
list_data = [1, "2", (3,)]
print(list_data)
# [1, '2', (3,)]

总结

下面是一些常见序列类型的分类,看来 list 还是最好用的万金油啊~

参考

评论