全部博文(921)
分类: Python/Ruby
2011-02-17 01:50:09
问题
你想去交换一些变量的值,但是你不想使用临时变量。
解决
python的自动元组打包和解包可以做到这点:
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的值)。 实际结果是一个在变量之间交换的值(你可以想想这个例子细节等价于一个旋转)
元组使用逗号打包,序列通过放置几个逗号分隔的目标到语句的左边来解包。他们都是有用的,简单的,普遍的机制。通过结合他们,你能简单地,优美地,自然地表达任何一组变量之间的值交换
#########################################################################################
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 可以利用一个打包,解包的过程来实现"不用临时变量来交换值" |