1 #交换两个变量值,不用中间变量,至少两种方案
2 #常规 借助中间变量
3 a='789'
4 b='na'
5 temp=a
6 a=b
7 b=temp
8 # print(a,b)
9
10 #姿势一 列表生成式
11 a=123
12 b='name'
13 a,b=b,a
14 #a,b=a,b 跟'a=b b=a'有什么区别?
15 #详细讲解参照:https://www.jianshu.com/p/014599ab2c10
16
17 #姿势二 加减法
18 #如果是数字 可以这样交换,如果字符串怎么搞?
19 a=10
20 b=20
21 a=a+b
22 b=a-b
23 a=a-b
24 print(a,b)
25
26 #姿势三 字符串切片
27 #如果是字符串 可以这样交换,采用切片,ww_lst[0:3] #ww_lst[:3] 效果是一样的,切片N:M,不包含M 当N为起始值可以省略
28 a='what'
29 b='your name'
30 a=a+b
31 a,b=a[len(a)-len(b):],a[:len(a)-len(b)]
32 print(a)
33 print(b)
=============================
那么,在x, y = y, x
的背后都发生了些什么呢?
一般情况下Python语句是从左到右解析一个语句的,但在赋值操作的时候,因为是右值具有更高的计算优先级,所以需要从右向左解析。
对于x, y = y, x
,它的执行顺序如下:
- 先计算右值
y , x
(这里是简单的原值,但可能会有表达式或者函数调用的计算过程), 在内存中创建元组(tuple),存储y, x
分别对应的值; - 计算左边的标识符,元组被分别分配给左值,通过解包(unpacking),元组中第一个标示符对应的值(y),分配给左边第一个标示符(x),元组中第二个标示符对应的值(x),分配给左边第二个标示符(y),完成了
x
和y
的值交换。
需要注意的是当左右值和标识符的数量不等时会出现ValueError
:
>>> x, y = 1, 2
>>> x, z = y, x, 3
ValueError: too many values to unpack
>>> y, x , a= x, y
ValueError: need more than 2 values to unpack
而当左值只有一个变量的时候,默认将右值打包(pack)成一个元组(tuple)传给右值。
>>> x = 1, 2
>>> x
(1, 2)
来源:简书
====================
''' 这里赋值之前,先计算右边的值,所以赋值前a=1,b=2 ,计算完后a,b=(2,1+2) 所以a=2 b=3 >>> a,b=1,2 >>> t=(b,a+b) >>> t[0] 2 >>> t[1] 3 >>> a,b=(b,a+b) >>> a 2 >>> b 3 '''