关于swap
,在C ++中,我们可以通过std::swap(x, y);
交换两个。
x
和y
作为reference
传递到交换。
但是在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)
这真的很麻烦,但我们无法通过reference or pointer
作为我们在C ++中可以做的事情,对吧?
修改
有没有其他方法不使用赋值(不使用=)?
答案 0 :(得分:5)
实际上,在Python中,它更优雅:
(a,b) = (b,a)
您根本不必调用函数。并且,是的,根据评论,括号在这里是不必要的。我仍然喜欢它们,因为我相信它们使意图更清晰。
编辑后:
有没有其他方式不使用作业(不使用
=
)?
可能,虽然我不知道一个,但我无法想象它会比上面显示的基本方式更简单或更易读。如果您正在寻找一种简单易行的更多复杂方式,我可否建议您采用错误的心态? : - )
答案 1 :(得分:2)
我不相信只是可以在Python中实现C ++的交换等效。
这是由于C ++对象模型和Python对象模型之间的根本区别。在python中,所有变量都引用对象。使用已实现的交换,所有发生的事情都是交换两个变量引用的对象。对象本身是不受影响的,所以没有任何引用现有对象的东西都会看到任何变化。
在C ++的std::swap
中,交换了两个对象的值,因此任何表示被交换对象的表达式都会看到这些变化。
>>> c = [ "hello", "world" ]
>>> d = []
>>> a = c
>>> b = d
>>> a, b = swap_in_python(a, b)
>>> c
['hello', 'world']
>>> d
[]
>>>
VS
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"
答案 2 :(得分:1)
Python通过指针传递。
更简单的交换:
x, y = y, x
答案 3 :(得分:1)
你可以直接写
a, b = (b, a)