列表
Python 中可以通过组合一些值得到多种 复合 数据类型。其中最常用的 列表 ,可以通过方括号括起、逗号分隔的一组值得到。一个 列表 可以包含不同类型的元素,但通常使用时各个元素类型相同:
squares = [1, 4, 9, 16, 25]
squares
[1, 4, 9, 16, 25]
和字符串(以及各种内置的 sequence 类型)一样,列表也支持索引和切片:
squares[0] # indexing returns the item
1
squares[-1]
25
squares[-3:] # slicing returns a new list
[9, 16, 25]
所有的切片操作都返回一个包含所请求元素的新列表。 这意味着以下切片操作会返回列表的一个 浅拷贝:
squares[:]
[1, 4, 9, 16, 25]
列表同样支持拼接操作:
squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
与 immutable 的字符串不同, 列表是一个 mutable 类型,就是说,它自己的内容可以改变:
cubes = [1, 8, 27, 65, 125] # something’s wrong here
4 ** 3 # the cube of 4 is 64, not 65!
64
cubes[3] = 64 # replace the wrong value
cubes
[1, 8, 27, 64, 125]
你也可以在列表结尾,通过 append() 方法 添加新元素 (我们会在后面解释更多关于方法的内容):
cubes.append(216) # add the cube of 6
cubes.append(7 ** 3) # and the cube of 7
cubes
[1, 8, 27, 64, 125, 216, 343]
给切片赋值也是可以的,这样甚至可以改变列表大小,或者把列表整个清空:
letters = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]
letters
[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]
replace some values
letters[2:5] = [‘C’, ‘D’, ‘E’]
letters
[‘a’, ‘b’, ‘C’, ‘D’, ‘E’, ‘f’, ‘g’]
now remove them
letters[2:5] = []
letters
[‘a’, ‘b’, ‘f’, ‘g’]
clear the list by replacing all the elements with an empty list
letters[:] = []
letters
[]
内置函数 len() 也可以作用到列表上:
letters = [‘a’, ‘b’, ‘c’, ‘d’]
len(letters)
4
也可以嵌套列表 (创建包含其他列表的列表), 比如说:
a = [‘a’, ‘b’, ‘c’]
n = [1, 2, 3]
x = [a, n]
x
[[‘a’, ‘b’, ‘c’], [1, 2, 3]]
x[0]
[‘a’, ‘b’, ‘c’]
x[0][1]
‘b’
元组
我们看到列表和字符串有很多共同特性,例如索引和切片操作。他们是 序列 数据类型(参见 序列类型 — list, tuple, range)中的两种。随着 Python 语言的发展,其他的序列类型也会被加入其中。这里介绍另一种标准序列类型: 元组。
一个元组由几个被逗号隔开的值组成,例如
t = 12345, 54321, ‘hello!’
t[0]
12345
t
(12345, 54321, ‘hello!’)
Tuples may be nested:
… u = t, (1, 2, 3, 4, 5)
u
((12345, 54321, ‘hello!’), (1, 2, 3, 4, 5))
如你所见,元组在输出时总是被圆括号包围的,以便正确表示嵌套元组。输入时圆括号可有可无,不过经常会是必须的(如果这个元组是一个更大的表达式的一部分)。给元组中的一个单独的元素赋值是不允许的,当然你可以创建包含可变对象的元组,例如列表。
虽然元组可能看起来与列表很像,但它们通常是在不同的场景被使用,并且有着不同的用途。元组是 immutable (不可变的),其序列通常包含不同种类的元素,并且通过解包(这一节下面会解释)或者索引来访问(如果是 namedtuples 的话甚至还可以通过属性访问)。列表是 mutable (可变的),并且列表中的元素一般是同种类型的,并且通过迭代访问。
一个特殊的问题是构造包含0个或1个元素的元组:为了适应这种情况,语法有一些额外的改变。空元组可以直接被一对空圆括号创建,含有一个元素的元组可以通过在这个元素后添加一个逗号来构建(圆括号里只有一个值的话不够明确)。丑陋,但是有效。例如
empty = ()
singleton = ‘hello’, # <-- note trailing comma
len(empty)
0
len(singleton)
1
singleton
(‘hello’,)
语句 t = 12345, 54321, ‘hello!’ 是 元组打包 的一个例子:值 12345, 54321 和 ‘hello!’ 被打包进元组。其逆操作也是允许的
x, y, z = t
这被称为 序列解包 也是很恰当的,因为解包操作的等号右侧可以是任何序列。序列解包要求等号左侧的变量数与右侧序列里所含的元素数相同。注意可变参数其实也只是元组打包和序列解包的组合。