变量解包 变量解包(unpacking)是Python里的一种特殊赋值操作,允许我们把一个可迭代对象(比如列表)的所有成员,一次性赋值给多个变量:
>>> usernames = ['bruce_liu', 'raymond']
>>> author, reader = usernames
>>> author
Out[4]: 'bruce_liu'
⚠️注意:左侧变量的个数必须和待展开的列表长度相等,否则会报错。
假如在赋值语句左侧添加小括号(…),甚至可以一次展开多层嵌套数据:
>>> attrs = [1, ['bruce_liu', 100]]
>>> user_id, (username, score) = attrs
>>> user_id
Out[7]: 1
>>> username
Out[8]: 'bruce_liu'
除了上面的普通解包外,Python还支持更灵活的动态解包语法。只要用星号表达式(*variables)作为变量名, 它便会贪婪地捕获多个值对象,并将捕获到的内容作为列表赋值给variables。
比如,下面data列表里的数据分为三段:头用户,尾为分数,中间的都是水果名称。通过把*fruits设置为中间的解包变量,我们就能一次性解包所有变量—fruits会捕获data去头去尾后的所有成员:
>>> data = ['bruce_liu', 'apple', 'orange', 'banane', 100]
>>> username, *fruits, score = data
>>> username
Out[10]: 'bruce_liu'
>>> fruits
Out[11]: ['apple', 'orange', 'banane']
>>> score
Out[12]: 100
和常规的切片赋值语句比起来,动态解包语法要直观许多:
# 动态解包
>>> username, *fruits, score = data
# 切片赋值
>>> username, fruits, score = data[0], data[1], data[-1]
# 两种变量赋值方式完全等价
上面的变量解包操作也可以在任何循环语句里使用:
>>> for username, score in [('bruce_liu', 100), ('raymond', 60)]:
... print(username)
...
bruce_liu
raymond