我知道在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/