C++与Python中的swap有什么区别?

2 投票
4 回答
1970 浏览
提问于 2025-04-17 03:37

在C++中,我们可以用 std::swap(x, y); 来交换两个变量。这里的 xy 是以“引用”的方式传递给交换函数的。

那么在Python中,我们能不能写一个 swap 函数,让它的工作方式和C++一样呢?我写的Python版本的交换函数有点笨:

def swap_in_python(x, y):
    return y, x

#so when swapping a and b, I usually do it like this
a, b = swap_in_python(a, b)

这确实有点麻烦,因为我们不能像在C++中那样传递“引用”或“指针”,对吧?

补充:

有没有其他方法可以不使用赋值(也就是不使用 =)来实现呢?

4 个回答

1

你可以直接写

a, b = (b, a)
2

我觉得在Python中实现C++的swap功能并不是一件简单的事。

这是因为C++和Python在对象处理上有根本的不同。在Python中,所有的变量都是指向对象的。你实现的swap操作,其实只是交换了两个变量所指向的对象,而这些对象本身并没有被改变。所以,任何指向这些对象的地方都不会看到变化。

而在C++的std::swap中,两个对象的值是直接交换的,这样任何表示这两个被交换对象的地方都会看到变化。

>>> c = [ "hello", "world" ]
>>> d = []
>>> a = c
>>> b = d
>>> a, b = swap_in_python(a, b)
>>> c
['hello', 'world']
>>> d
[]
>>>

std::list<std::string> c, d;
c.push_back("hello");
c.push_back("world");
std::list<std::string> &a = c, &b = d;
std::swap( a, b ); // c is empty, d is "hello", "world"
5

其实,在Python中,这样写要优雅得多:

(a,b) = (b,a)

你根本不需要调用一个函数。而且,正如评论中所说,这里的括号其实是多余的。我还是喜欢用括号,因为我觉得这样能更清楚地表达意图。


接下来的编辑:

有没有其他方法可以不使用赋值(不使用 =)?

可能有,但我不知道有什么方法,而且我想不出比上面这种基本的方法更简单或更易读。如果你在寻找一种复杂的做法,而其实可以简单解决,那我想你可能思路不太对哦?:-)

撰写回答