本篇博客的内容翻译自《learning the python》,但是也添加了一些自己的理解。
![](https://i-blog.csdnimg.cn/blog_migrate/a6000b71afd584763ad7b19a5e00001e.jpeg)
前言
我们使用赋值表达式将一个名字分配给一个对象。在它的基本形式下,左边是赋值目标,右边是将要被分配的对象。通常情况下,它的作用是显而易见的。但是有下面几点要牢记
- 赋值创造对象名字
- 名字在第一次分配的时候被创建
- 名字在被引用之前必须被创造
- 一些赋值操作并不是那么精确
赋值语句的形式
操作 | 含义 |
---|---|
spam = ‘spam’ | Basic form |
spam, ham = ‘yum’, ‘YUM’ | tuple assignment |
[spam, ham] = [‘yum’, ‘YUM’] | List assigment |
a, b, c, d = ‘spam’ | sequence assignment |
a, *b = ‘spam’ | Extended sequence unpacking |
spam = ham = ‘lunch’ | Multiple assignment |
spams += 42 | Extended assignment |
序列赋值
下面是一个例子
% python
>>> nudge = 1 # Basic assignment
>>> wink = 2
>>> A, B = nudge, wink # Tuple assignment
>>> A, B # Like A = nudge; B = wink
(1, 2)
>>> [C, D] = [nudge, wink] # List assignment
>>> C, D
(1, 2)
注意到,在第三行,我们实际上是输入了两个tuples,我们省略了它们的小括号,python把左边tuple中的值和右边tuple中的值进行配对,然后挨个赋值。
tuple assignment操作的引入让我们可以实现一些有趣的操作,看看下面的代码
>>> a = 1
>>> b = 2
>>> (a, b) = (b, a)
>>> a
2
>>> b
1
>>>
我们利用sequence轻松地实现了两个名字值的交换,这实际上是把名字a从1上撕下来贴在2上,把名字b撕下来贴在1上。
事实上,这种赋值已经不限于tuple,而是被通用化为任意两个sequence类型之间的赋值操作,但要求表达式两边的元素个数相同。看下面的两例子。
>>> [a, b, c] = (1, 2, 3) # Assign tuple of values to list of names
>>> a, c
(1, 3)
>>> (a, b, c) = "ABC" # Assign string of characters to tuple
>>> a, c
('A', 'C')
上面的代码要求表达式两边的元素个数必须对应相同,但我们可以使用切片操作来进一步通用化这种sequence操作,看下面的例子。
>>> a, b, c = string[0], string[1], string[2:] # Index and slice
>>> a, b, c
('S', 'P', 'AM')
>>> a, b, c = list(string[:2]) + [string[2:]] # Slice and concatenate
>>> a, b, c
('S', 'P', 'AM')
>>> a, b = string[:2] # Same, but simpler
>>> c = string[2:]
>>> a, b, c
('S', 'P', 'AM')
>>> (a, b), c = string[:2], string[2:] # Nested sequences
>>> a, b, c
('S', 'P', 'AM')
扩展序列操作
我们使用*来增强sequence赋值的功能
>>> seq = [1, 2, 3, 4]
>>> a, *b = seq
>>> a 1
>>> b
[2, 3, 4]
和前面一样,这适用于所有可迭代对象,而且*可以放在任何地方。
这看起来和切片操作一样,但是实际上,切片返回的是和被切对象一样的对象,而上面的操作返回的总是一个列表,不管它对什么序列进行操作。
下面我们来看看扩展序列操作在循环中的应用
for (a, *b, c) in [(1, 2, 3, 4), (5, 6, 7, 8)]:
...
这是一个for循环,在第一次循环中,会执行这样的操作
a, *b, c = (1, 2, 3, 4)
在第二次循环中会执行类似的操作
a, *b, c = (5, 6, 7, 8)
后面的多目标赋值和扩展赋值基本用法很简单,当用到它们的高级用法的时候再来补充。
总结
原来python的赋值操作那么讲究