python两个数值互换(浅析a,b=b,a原理)

发布时间:2024-12-10 13:32

记住"CPR"(心肺复苏)的口诀:"C-A-B,先C再A后B" #生活技巧# #紧急应对技巧# #医疗急救电话#

最新推荐文章于 2022-05-14 10:05:00 发布

置顶 土豆洋芋山药蛋 于 2017-11-13 17:02:18 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

python交换两个值得方法非常简单,即a,b=b,a,一步操作就交换了两个值,那么这是为什么呢?

真相:

Python的变量并不直接存储值,而只是引用一个内存地址,交换变量时,只是交换了引用的地址。

先看下面这段程序:

import dis def func(a,b): a,b=b,a print(a,b) a=10 b=20 func(a,b) dis.dis(func) 12345678910

一般来说一个Python语句会对应若干字节码指令,Python的字节码是一种类似汇编指令的中间语言,但是一个字节码指令并不是对应一个机器指 令(二进制指令),而是对应一段C代码,而不同的指令的性能不同,所以不能单独通过指令数量来判断代码的性能,而是要通过查看调用比较频繁的指令的代码来 确认一段程序的性能。
  一个Python的程序会有若干代码块组成,例如一个Python文件会是一个代码块,一个类,一个函数都是一个代码块,一个代码块会对应一个运行的上下文环境以及一系列的字节码指令。

dis的作用
  dis模块主要是用来分析字节码的一个内置模块,经常会用到的方法是dis.dis([bytesource]),参数为一个代码块,可以得到这个代码块对应的字节码指令序列。

代码输出结果
这里写图片描述
其中只看前面为12的结果就行了(在我的编译器里,交换的那一行代码在第12行)

可以看出主要是ROT_TWO指令的功劳:
查阅python文档可以知道有ROT_TWO (源码1398行),ROT_THREE(源码1406行), ROT_FOUR这样的指令,可以直接交换两个变量、三个变量、四个变量的值
在python3.4的源码中查阅ceval.c文件可以看到:

TARGET(ROT_TWO) { PyObject *top = TOP(); PyObject *second = SECOND(); SET_TOP(second); SET_SECOND(top); FAST_DISPATCH(); } TARGET(ROT_THREE) {PyObject *top = TOP();PyObject *third = THIRD();SET_SECOND(third);FAST_DISPATCH(); } 12345678910111213

附:python值的交换

变量的每一次初始化,都开辟了一个新的空间,将新内容的地址赋值给变量。对于下图来说,我们重复的给str1赋值,其实在内存中的变化如图:
这里写图片描述
从上图我们可以看出,str1在重复的初始化过程中,是因为str1中存储的元素地址由’hello world’的地址变成了’new hello world’的。

对于复杂的数据类型来说,改变其内部的值对于变量的影响:
这里写图片描述
这里写图片描述
当对列表中的元素进行一些增删改的操作的时候,是不会影响到lst1列表本身对于整个列表地址的,只会改变其内部元素的地址引用。可是当我们对于一个列表重新初始化(赋值)的时候,就给lst1这个变量重新赋予了一个地址,覆盖了原本列表的地址,这个时候,lst1列表的内存id就发生了改变。上面这个道理用在所有复杂的数据类型中都是一样的。

参考:
Ziqiao
http://www.cnblogs.com/Eva-J/p/5534037.html

网址:python两个数值互换(浅析a,b=b,a原理) https://www.yuejiaxmz.com/news/view/434228

相关内容

语句: a='Hello' b='Python' print((a+b)*2)
有两个分数,A=333/4444, B=4444/55555, 那么A与B哪个大?
一道数学求值题若a,b,c是两两不相等实数,其中a是b和c的等比中项,b是a和c的等差中项,则(a/b)+(c/a)=?请写出推导过程
a∩b
证明布尔等式A+A‘B=A+B
R(A+B)<=R(A)+R(B): R(AB)<=min(R(A)+R(B)): A为m×n矩阵,r(A)=n,则AX=0只有零解。设矩阵A为m×n的秩R(A)=m;Ax=b 有解;
figsize = (a, b)
String a = “123”; String b = “123”; a==b 吗?为什么??
定义符号min{a.b}的含义为:当a≥b时.min{a.b}=b,当a<b时.min{a.b}=a.如:min{2.
若a+b=4,a²+b²=18,求a,b

随便看看