gpt4 book ai didi

python - 在python中交换变量

转载 作者:行者123 更新时间:2023-12-04 09:33:48 28 4
gpt4 key购买 nike

我知道在 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) 可变的。他使用列表,但您可以使用 dict 或任何可变对象。
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/

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