gpt4 book ai didi

python - 在 Python 中如何实现交换变量?

转载 作者:行者123 更新时间:2023-12-05 00:46:06 24 4
gpt4 key购买 nike

以下代码在 Python 中是如何工作的:

a = input()
b = input()
a, b = b, a # STATEMENT 1
print(a, b)

语句 1 是在 Python 堆内存空间中创建第三个变量来交换两个数字还是使用某种算法来进行交换?

最佳答案

ruohola在提供python代码的翻译字节码方面做得很好。

我在这里复制以供引用:

Python 代码:

a = input()
b = input()
a, b = b, a # STATEMENT 1
print(a, b)

字节码:

 2           0 LOAD_NAME                0 (input)
2 CALL_FUNCTION 0
4 STORE_NAME 1 (a)

3 6 LOAD_NAME 0 (input)
8 CALL_FUNCTION 0
10 STORE_NAME 2 (b)

4 12 LOAD_NAME 2 (b)
14 LOAD_NAME 1 (a)
16 ROT_TWO # swapping done here
18 STORE_NAME 1 (a)
20 STORE_NAME 2 (b)
22 LOAD_CONST 0 (None)
24 RETURN_VALUE

ROT_TWO 操作交换 python 堆栈的前 2 个值。那么到目前为止我们实际上有什么:

Python swaps the 2 values by calling a swap (ROT_TWO) subroutine.

如果这是您想要走多远并且它回答了您的问题,那很好。但是对于那些想要更深入地了解这个交换 (ROT_TWO) 子例程如何工作的人来说,here is the official CPython implementation :

#define TOP()             (stack_pointer[-1])
#define SECOND() (stack_pointer[-2])
#define SET_TOP(v) (stack_pointer[-1] = (v))
#define SET_SECOND(v) (stack_pointer[-2] = (v))
/*..*/
case TARGET(ROT_TWO): {
PyObject *top = TOP();
PyObject *second = SECOND();
SET_TOP(second);
SET_SECOND(top);
FAST_DISPATCH();
}

或者换句话说ROT_TWO的实现实际上执行了以下步骤(a,b是栈顶2个值) :

x1 = a
x2 = b
a = x2
b = x1

所以实现使用辅助临时位置(x1x2),实际上它使用2个辅助内存位置而不是最少的1个用于交换两个值的辅助位置,内存效率更高的实现会这样做:

x = a
a = b
b = x

在当前的计算模型下,swapping two values can be done only in so many different ways并且不会神奇地发生:

  1. 使用辅助临时存储
  2. 使用一系列 XOR(或类似的算术)运算

总而言之,Python 在底层确实使用辅助临时位置来交换两个值。

关于python - 在 Python 中如何实现交换变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61976462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com