python两个数值交换

    xiaoxiao2023-10-16  30

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

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

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

    先看下面这段程序:

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

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

    输出结果:

    其中只看前面为12的结果就行了(在我的编译器里,交换的那一行代码在第12行) 可以看出主要是ROT_TWO指令的功劳:交换栈顶的两个元素实现x和y值的互换 查阅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(); }

    https://www.jianshu.com/p/1cc3282bfe29

    最新回复(0)