C++与Python中的swap有什么区别?
在C++中,我们可以用 std::swap(x, y);
来交换两个变量。这里的 x
和 y
是以“引用”的方式传递给交换函数的。
那么在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)
你根本不需要调用一个函数。而且,正如评论中所说,这里的括号其实是多余的。我还是喜欢用括号,因为我觉得这样能更清楚地表达意图。
接下来的编辑:
有没有其他方法可以不使用赋值(不使用
=
)?
可能有,但我不知道有什么方法,而且我想不出比上面这种基本的方法更简单或更易读。如果你在寻找一种更复杂的做法,而其实可以简单解决,那我想你可能思路不太对哦?:-)