python中的赋值操作

本篇博客的内容翻译自《learning the python》,但是也添加了一些自己的理解。

前言

我们使用赋值表达式将一个名字分配给一个对象。在它的基本形式下,左边是赋值目标,右边是将要被分配的对象。通常情况下,它的作用是显而易见的。但是有下面几点要牢记

  • 赋值创造对象名字
  • 名字在第一次分配的时候被创建
  • 名字在被引用之前必须被创造
  • 一些赋值操作并不是那么精确

赋值语句的形式

操作含义
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 += 42Extended 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的赋值操作那么讲究

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值