python的赋值是通过“=
” 将右边的对象
赋值给左边的变量
,如:
a = 'test' #将字符串赋值给变量a
a = 123 #将数值赋值给变脸a
a = [1,2,3] #将列表赋值给变量a
通过上面的赋值测试,我们会发现变量a
是没有类型的,而类型的区别只存在于右侧的对象中。故可以将各种类型的对象赋值给变量。在Python内部,对于赋值的实现,本质上是建立将变量指向对象的引用过程,并不是将对象进行复制的过程。赋值过程有以下三个特点:
- 赋值的过程是建立变量到对象的引用的过程
- 变量在首次赋值时被创建
- 变量在引用前必须先赋值
python将=
右侧序列的值依次和左侧的序列中的变量相互对应匹配,给每一个变量赋值,如:
a,b,c = [1,2,3]
a,b,c=(1,2,3)
(a,b,c)=1,2,3
(a,b,c)=[1,2,3]
a,b,c=1,2,3
*a,b = 1,2,3 #首先满足非*的变量,剩下的通过列表复制给待*的变量,如果没有剩下的值,那么列表为空。其典型应用详见小技巧4.
所谓序列赋值,指元组、列表这样的序列可以一次性对序列长度相等的变量进行赋值。数值必须相等
。如下面的就要报错:
a,b=1,2,3
ValueError: too many values to unpack (expected 2)
不仅仅是元组或列表,只要对象切好是可迭代的,那么就可以执行分解操作,如分解字符串、字典:
a,b,c,d,e = 'hello'
dct = {'a':1, 'b':2, 'c':3}
a,b,c = dct #只是将字典中的key 复制给a,b,c
小技巧1:交换两变量的值:
a = 1
b = 1
a,b =b,a #完成a,b值的交换
小技巧2:依次给变量赋值n个整数
a,b,c,d,e,f = range(6)
小技巧3:如果=
两边长度不相等怎么处理呢?处理如下:
给需要单独处理的变量前加上*
,此时在赋值时如果不能对应,那么就会通过将一个列表赋值给该变量,列表中的内容为按序多出来的对象或者空列表
a,b,c=1,2,3,4 #会报错
a,b,*c=1,2,3,4 #c为[3,4],a,b正常赋值
a,*b,c=1,2,3,4 #b为[2,3],a,c正常赋值
*a,b,c=1,2,3,4 #a为[1,2],b,c正常赋值
a,b,c,d,*e=1,2,3,4 #e将得到一个空列表
小技巧4:递归求和
P = [1, 10, 7, 4, 5, 9] #求列表P中个元素之和
def sum_p(items):
head, *tail = items
return head + sum(tail) if tail else head
sum_p(P) #output: 36
就是对多个变量直接赋予一个初始值,如在程序开始前给多个计数器变量赋值为0:
a=b=c=d=e=0
此种方式赋值需要注意列表的可变性。
截图如下了:
解释一个例子,其他都类似:
X += Y 本质是 X = X + Y,先求X+Y的和,再将其赋值给X