python - 在Python中交换变量

标签 python python-3.x swap

我知道在Python中你可以通过以下方式交换变量的值

x,y=y,x

但我想要一个函数,使此交换仅向其提供变量,而不必返回值来实现此交换。让我通过交换 x,y 的示例来更清楚地说明一下:

x,y=1,0
print(x,y)  # This prints 1,0

def swapper(a,b):
    #Something that swaps the variables and doesn't return anything.

swapper(x,y)
print(x,y)  # This prints 0,1

这可能吗?如果没有,为什么不呢?

编辑:是的,我想知道是否可能完全我写的,而不是另一个实现,但该函数应该能够交换任意两个变量。您可以将其视为一个空文件,它不会用于更大的程序。仅用于学习目的。

最佳答案

我认为通过与 C/C++ 的比较可以最好地解释这一点。采取这个功能:


void swap(int &x, int &y) {
   int temp = *x;
   *x = *y;
   *y = temp;
}

这段代码做了你想要它做的事情,但在Python中这是不可能的。原因如下:

C 函数的关键部分是函数签名 *x, *y,它使参数成为指针。当您执行 *x = *y 时,您将覆盖 x 指向的内存。在Python中,你不能传递指针,只能传递引用。不同之处在于,覆盖引用对原始对象没有任何作用。例如,

x = "foo"
y = x
x = "bar"
print(x, y) # bar, foo not bar, bar

解决这个问题的任何方法都必须处理这个问题,例如@adamgy的回答。他的方法使用双重引用。你传递的东西可以 i) 保存引用并且 ii) 可变。他使用列表,但您可以使用字典或任何可变对象。

PS:可能有一种使用 CPython API 来做到这一点的方法,但这有点极端。

标准实现中的所有 Python 对象都有一个底层 C 对象。您可以用 C 实现 python 函数。

static PyObject * swap(PyObject *a, PyObject *b)
{
 // logic
}

设计一个接受指向指针的指针的函数也许是可能的。


static PyObject * swap(PyObject *a, PyObject *b)
{
   swap_internal(&a, &b);
   // more logic
}

static PyObject * swap_internal(PyObject **a, PyObject **b)
{
 // logic
}

这将具有必要的双引用语义,但我还没有检查它是否确实有效。

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

相关文章:

javascript - 使用 Python 将 JavaScript 数组转换为 JSON

Python 类变量不更新

python - 如何进行视频取景?

mysql - SQLServer pyodbc 的 Python 驱动程序比 psycopg2 和带有插入的 mysql.connector 慢得多

python - Pandas 按任何给定列中的特定值分组

python-3.x - python3中的find()方法

python - 如何使用 pyparsing LineStart?

java - 在Java中使用构造函数和新对象

c - 将第一个数字与第二个数字交换,将第二个数字与第三个数字交换,等等

c++ - 从函数交换并返回 Char 数组