一、赋值语句
赋值语句形式
spam = 'SPAM' #基础形式
spam,ham = 'yum', 'YUM' #元组赋值(基于位置)
[spam,ham] = ['yum','YUM'] #列表赋值(基于位置)
a,b,c,d = 'spam' #序列赋值
a, *b = 'spam' #扩展的序列赋值
spam = ham = 'lunch' #多目标赋值
spams += 42 #增量赋值
二、赋值的几种形式
- 元组及列表解包赋值(序列赋值)
当你在“=”左侧编写元组和列表时,python会按照位置把右侧的对象和左侧的目标从左至右相配对。
>>> nudeg = 1
>>> wink = 2
>>> A, B = nudeg, wink
>>> A, B
(1, 2)
>>> [C, D] = [nudeg, wink]
>>> C,D
(1, 2)
解包赋值也能用于交换两个变量的值,从而不需要另外创建临时变量
>>> nudge = 1
>>> wink = 2
>>> nudge, wink = wink,nudge
>>> nudge,wink
(2, 1)
可以将值元组赋给变量列表,字符串中字符赋值给变量元组。python会按照位置从左到右,把右侧序列的元素赋值给左侧序列的变量。
>>> [a,b,c]=(1,2,3)
>>> a,c
(1, 3)
>>> (a,b,c)="ABC"
>>> a,c
('A', 'C')
注意: 序列赋值通常要求左侧的目标名称数目和右侧的主体对象的数目完全一致
- 扩展的序列赋值
一个带有单个星号的名称*X,带有星号的名称会被赋值一个列表,该列表收集了序列中剩下没被赋值给其他名称的所有项。
>>> seq = [1,2,3,4]
>>> a,*b = seq
>>> a
1
>>> b
[2, 3, 4]
- 多目标赋值
多目标赋值是将最右侧的对象依次赋值给左侧的所有名称。
>>> a = b = c = 'spam'
>>> a,b,c
('spam', 'spam', 'spam')
多目标赋值与共享引用:要记住这里只有一个对象,但由三个变量共享(全部指向内存中的同一个对象)。
赋值不可变对象:只要赋值的对象时不可变的,即使有一个以上的名称引用该对象也不会相互影响。
>>> a = b = 0
>>> b = b + 1
>>> a,b
(0, 1)
赋值可变对象:可变对象支持原位置修改,就会相互影响。
>>> a = b =[]
>>> b.append(40)
>>> a,b
([40], [40])
为避免这种问题,需要不同的语句初始化不同的可变对象
>>> a=[]
>>> b=[]
>>> b.append(40)
>>> a,b
([], [40])
- 增量赋值
x += y x &= y x -= y x |= y
x *= y x ^= y x /= y x >>= y
x %= y x <<= y x **= y x //= y
增值赋值与共享引用:"+="对于列表来说是原位置修改,"+"拼接操作总是产生新的对象。
>>> L = [1,2]
>>> M =L
>>> L = L +[3,4]
>>> L,M
([1, 2, 3, 4], [1, 2])
---------------------------------------------
>>> L = [1,2]
>>> M = L
>>> L += [3,4]
>>> L,M
([1, 2, 3, 4], [1, 2, 3, 4])
网友评论