多重指定可以让我们一次指定多个变量,例如:
x, y, z = 1, 2, 3
在等号右边的数据列,其实就是一个没加小括号的 tuple。凡是在需要多个值的场合,tuple 会自动解包(tuple unpacking),然后将元素一一指定给对应的变量。此时等号两边的项目数量必须相同才行,否则会产生错误。
等号的两边都可以是容器
只要是可读取元素的容器,都可以自动解包。甚至等号的左边也可以是有顺序的容器:tuple 或 list(有顺序才能依顺序做指定),例如:
a, b, c = (1, 2, 3) # 将 tuple 指定到逗好分隔的变量
(d, e, f) = [4, 5, 6] # 将 list 指定到 tuple 中的变量
[g, h, i] = "xyz" # 将 string 指定到 list 中的变量
print(a, b, c, d, e, f, g, h, i) # 输出为 1 2 3 4 5 6 x y z
等号的左边如果是容器,那么也会自动解包。例如:(d, e, f) = [4, 5, 6] 会自动更改成 d, e, f = 4, 5, 6 。
解包时,等号的两边也可以是多层容器
等号的两边也可以是多层的容器,只要两边的结构完全相同即可。例如:
[(a, b), c] = ([1, 2], 3)
print(a, b, c) # 输出为 1 2 3
这样做的好处是可以用多个易读的变量来代表右边容器中的元素,而不是用难懂的索引编号。
写法一:
a = (1011, (‘张天才’, ‘老张’))
print(a[1][0] + “外号” + a[1][1] + “, ID:” + str(a[0]))
写法二:
(person_id, (name, nick)) = (1011, (‘张天才’, ‘老张’))
Print(name + “外号” + nick + “, ID:” + str(person_id))
在变量前面加 * 来打包(packing)多个元素
有时候我们只想用多变量来处理容器中的部分元素,而剩下的元素则仍以容器的形式来处理,这时候就可用「*变量」来表示〝多出来的都打包成 list 给这个变量〞。例如:
x, y, *z = 1, 2, 3, 4, 5
Print(x, y, z) # 输出为 1 2 [3, 4, 5]
如果要打包的是 y,那么 y 会依序打包 [2, 3, 4],并留 5 给 z:
x, *y, z = 1, 2, 3, 4, 5
print(x, y, z) # 输出为 1 [2, 3, 4] 5
互换变量的值
在使用多重指定时,如果将变量放在等号的右边,那么在解包时会先将其值取出来再做指定,此时该数据就和变量无关,因此多重指定也可以用来互换变量的值。例如:
a, b, = 1, 2
a, b = (b, a) # 先将 (b, a) 解包为 2, 1,再指定给 a, b
print(a, b) # 输出为 2 1