Каковы различия между swap в C ++ и Python? - PullRequest
2 голосов
/ 04 октября 2011

О swap, в C ++ мы можем поменять местами два на std::swap(x, y);. x и y передаются в своп как reference.

Но в Python мы можем также написать функцию swap, которая может выполнять обмен так же, как в C ++? Python-версия swap, которую я реализовал, довольно глупа:

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 ++, верно?

EDIT:

Есть ли другой способ не использовать присваивание (не используя =)?

Ответы [ 4 ]

5 голосов
/ 04 октября 2011

На самом деле, в Python это намного элегантнее:

(a,b) = (b,a)

Вам не нужно вообще вызывать функцию.И, да, согласно комментариям, скобки здесь не нужны.Я по-прежнему предпочитаю их, так как считаю, что они проясняют намерения.


После редактирования:

Есть ли другой способ не использовать назначение (не используя =)?

Возможно, хотя я не знаю ни одного, и я не могу представить, что это будет проще или более читабельно, чем основной способ, показанный выше.Если вы ищете более сложный способ сделать что-то, что можно сделать просто, могу ли я предположить, что вы ошиблись?: -)

2 голосов
/ 04 октября 2011

Я не верю, что можно просто реализовать эквивалент обмена C ++ в Python.

Это связано с фундаментальными различиями между объектной моделью 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
[]
>>>

против

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"
1 голос
/ 04 октября 2011

Вы можете просто написать

a, b = (b, a)
1 голос
/ 04 октября 2011

Python проходит по указателю.

Упрощенный обмен:

x, y = y, x
...