问题
你想去交换一些变量的值,可是你不想使用临时变量。
解决
python的自动元组打包和解包能够作到这点:
a, b, c = b, c, a python
Python代码
a, b, c = b, c, a
讨论
许多程序语言让你使用临时中间变量去交换变量的值。
temp = a
a = b
b = c
c = temp
可是python让你使用tuple的打包和解包来直接赋值
a, b, c = b, c, a
在一个赋值中,python要求等号右边是一个表达式。 这里咱们所写的b, c, a的确是表达式。要明确的是,它是一个元组, 有三个元素的不可变的序列。元组常常用圆括号括起来, 象(b, c, a)。 可是在这里除了逗号是有一些其余的意思之外(在一个函数调用中),圆括号不是必须的。
经过打包元组的每一项,用逗号来创建一个元组.在赋值语句的等号的左边,你能够正常的使用单个的对象。 这个对象可以是简单的一个标示符号(也就是众所周知的变量), 一个索引(例如alist[i] 和 adict['freep']), 一个属性的引用(如anobject.someattribute)等等。然而,python也让你在赋值语句的左边,使用几个用逗号分开的对象(变量,索引等等)。 那样的一个多赋值也被称为解包赋值。 当有两个或者更多的逗号分隔开的对象在一个赋值语句的左边, 右边的值必须是一个序列,并且它的数目要和左边逗号分隔的对象同样多。序列的每一项都被从左到右依次赋给相对应的目标值。
在这个配方中(译注:书的名字叫python食谱,因此每一节都称为一个配方:)),
咱们有三个逗号分隔的目标对象在左边,因此咱们须要右边有三个元素的序列,他们是有三个元素的被打包的元组。第一个目标(变量)获得第一个元素的值(它使用变量b的值), 第二个目标(b)获得第二个元素的值(它使用变量c的值), 而且第三个即最后一个目标(c)获得第三即最后一个元素(使用变量a的值)。 实际结果是一个在变量之间交换的值(你能够想一想这个例子细节等价于一个旋转)
元组使用逗号打包,序列经过放置几个逗号分隔的目标到语句的左边来解包。他们都是有用的,简单的,广泛的机制。经过结合他们,你能简单地,优美地,天然地表达任何一组变量之间的值交换
######################################################################################### sql
python的打包操做,是指把现有的数据放到一个tuple中,例如: >>> t = 1 >>> t 1 >>> t = 1, >>> t (1,) sqlite3里面的execute函数会过滤特殊符号,好比@,相似于: select name,mail from mTable where mail = 'aa@bb.com' 这样的语句里面的@就会被过滤掉,用tuple打包下就不会了: sqlString = 'aa@bb.com', 如今sqlString是一个tuple了,直接把它传进去,就ok. 关于解包,还有一个有趣的应用: >>> a = 1 >>> b = 2 >>> a,b = b,a >>> a 2 >>> b 1 能够利用一个打包,解包的过程来实现"不用临时变量来交换值"
|