<python 深入理解>变量交换x,y=y,x实现机制--元组
2015-03-05 20:16
771 查看
python中有一种赋值机制即多元赋值,采用这种方式赋值时,等号两边的对象都是元组并且元组的小括号是可选的。通常形式为
等同于 (x, y, z) = (1, 2, 'a string')
这种赋值类型最经常用到的环境是变量交换,形如
这种交换方式无需中间变量即可交换两个变量的值。那么具体实现机制是怎样的呢?
运行时,首先构造一个元组(y, x),然后构造另一个元组(x, y),接着用元组(y, x)赋值给(x, y),元组赋值过程从左到右,依次进行。假如x=1,y=2,先令x=y,此时x=2,然后令y=x,y应该等于2?那么就不能实现变量交换了?对于这个问题,应该从元组的特性说起。
变量名x, y, z都是引用,内存开辟除了三个空间分别存储1, 2, 'a string',三个变量分别指向这三块地址。由这三个变量构造的元组tuple,它有三个元素,这三个元素并不是x,y,z这三个变量,而是这三个变量所指向的地址空间里的内容。如果此时再另x=4,此时在地址空间会另开辟出一块空间存储4,x进而指向这块空间,而元组内的三个值仍保持不变。
所以对于 x, y = y, x 来说,首先由y,x所构成的元组(y,x)其实应该表示为(2,1),那么再从左到右赋值,就可以交换变量的值了。
x, y, z = 1, 2, 'a string'
等同于 (x, y, z) = (1, 2, 'a string')
这种赋值类型最经常用到的环境是变量交换,形如
x, y = y, x
这种交换方式无需中间变量即可交换两个变量的值。那么具体实现机制是怎样的呢?
运行时,首先构造一个元组(y, x),然后构造另一个元组(x, y),接着用元组(y, x)赋值给(x, y),元组赋值过程从左到右,依次进行。假如x=1,y=2,先令x=y,此时x=2,然后令y=x,y应该等于2?那么就不能实现变量交换了?对于这个问题,应该从元组的特性说起。
x, y, z = 1, 2, 'a string' tuple = (x, y, z)
变量名x, y, z都是引用,内存开辟除了三个空间分别存储1, 2, 'a string',三个变量分别指向这三块地址。由这三个变量构造的元组tuple,它有三个元素,这三个元素并不是x,y,z这三个变量,而是这三个变量所指向的地址空间里的内容。如果此时再另x=4,此时在地址空间会另开辟出一块空间存储4,x进而指向这块空间,而元组内的三个值仍保持不变。
所以对于 x, y = y, x 来说,首先由y,x所构成的元组(y,x)其实应该表示为(2,1),那么再从左到右赋值,就可以交换变量的值了。
相关文章推荐
- Android 源码系列之<十四>从源码的角度深入理解LeakCanary的内存泄露检测机制(下)
- 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!
- 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!
- Android 源码系列之<十三>从源码的角度深入理解LeakCanary的内存泄露检测机制(中)
- 深入理解异或运算 xor 的含义——再探不使用加减乘除实现加法运算、不使用额外空间交换两个变量的值
- 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!
- 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!
- 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!
- 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!
- c语言深入理解<2>
- 求砖拍:绝对深入剖析各种方法实现两个变量的交换
- c语言深入理解<4>
- 深入理解Lua的全局变量_G以及源码实现
- 交换两个数不使用第三方变量=!!=深入理解按位异或运算符
- [笔试题]交换两个数不使用第三方变量 深入理解按位异或运算符
- <MFC_1>深入剖析MFC的WinMain和消息机制
- <PY><core python programming笔记>C6 序列:字符串和列表和元组(一)
- 求砖拍:绝对深入剖析各种方法实现两个变量的交换
- 多样化实现Windows phone 7本地数据访问<5>——深入Rapid Repository
- 深入理解Redis主键失效原理及实现机制