【python的练习题】:交换两个变量值,不用中间变量,涉及字符串的切片

 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,它的执行顺序如下:

  1. 先计算右值y , x(这里是简单的原值,但可能会有表达式或者函数调用的计算过程), 在内存中创建元组(tuple),存储y, x分别对应的值;
  2. 计算左边的标识符,元组被分别分配给左值,通过解包(unpacking),元组中第一个标示符对应的值(y),分配给左边第一个标示符(x),元组中第二个标示符对应的值(x),分配给左边第二个标示符(y),完成了xy的值交换。

    需要注意的是当左右值和标识符的数量不等时会出现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)
链接:https://www.jianshu.com/p/014599ab2c10

来源:简书

====================
''' 这里赋值之前,先计算右边的值,所以赋值前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
'''