1.序列解包
python中支持同时(并行)给多个变量赋值:
>>> x,y,z = 1,2,3
>>> print(x,y,z)
1 2 3
>>> x,y = y,x #使用一条语句实现交换
>>> print(x,y,z)
2 1 3
这种方式成称为序列解包(或可迭代对象解包):
将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中。
>>> values = (1,2,3) #u一个元组
>>> values
(1, 2, 3)
>>> x,y,z = values
>>> y
2
这在使用返回元组(或其他序列或可迭代对象)的函数或方法时很有用。
但是需要注意
要解包的序列包含的元素个数必须和你在等号左边列出的目标个数相同,否则Python会引发异常。
>>> x,y,z = 1,2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)
但是当右边的值多余的时候,可用星号*
来收集多余的值。这样无需确保值和变量个数相同。
>>> a,b,*rest = [1,2,3,4]
>>> rest
[3, 4]
>>> a,*mid,b = [1,2,3,4]
>>> mid
[2, 3]
>>> a,*b,c = [1,2,3]
>>> b
[2]
>>> a,b,c
(1, [2], 3)
赋值语句的右边可以是任何类型的序列,但是带型号的变量最终包含的总是一个列表。即使变量和值的个数匹配。
2.链式赋值
链式赋值是一种快捷方式,用于将多个变量关联到同一值。
x = y = somefunction()
上述代码与下面代码等价:
y = somefunction()
x = y
但是与下面代码不等价:
x = somefunction()
y = somefunction()
3.增强赋值
python支持增强赋值操作,包含所有的标准运算符,如*、/、%等。
>>> x = 2
>>> x += 1
>>> x *= 2
>>> x /= 3
>>> x
2.0
当然又可以用于其他数据类型,如字符串:
>>> s = 'foo'
>>> s += 'bar'
>>> s *= 2
>>> s
'foobarfoobar'
参考资料
1.Beginning Python From Novice to Professional Third Edition. Magnus Lie Hetland 著
2.Python标准英文文档