В Python я видел два значения переменных, которые меняются местами с использованием этого синтаксиса:
left, right = right, left
Считается ли это стандартным способом обмена двумя значениями переменных или есть какие-то другие средства, по которым две переменные обычно обмениваются чаще всего?
python
syntax
swap
conventions
WilliamKF
источник
источник
Ответы:
Это означает следующее для выражения
a,b = b,a
:b,a
оценивается правая часть , то есть в памяти создается кортеж из двух элементов. Два элемента - это объекты, обозначенные идентификаторамиb
иa
существовавшие до выполнения инструкции во время выполнения программы.a
был назначен первому элементу кортежа (то есть объекту, который ранее был b перед свопом, потому что он имел имяb
)и Второй идентификатор
b
присваивается второму элементу кортежа (который является объектом, который ранее был до обмена, потому что его идентификаторы былиa
)Этот механизм эффективно поменял местами объекты, назначенные идентификаторам,
a
иb
Итак, чтобы ответить на ваш вопрос: ДА, это стандартный способ поменять два идентификатора на два объекта.
Кстати, объекты не являются переменными, они являются объектами.
источник
a, b, c = c, a, b
.Это стандартный способ поменять две переменные, да.
источник
Я знаю три способа обмена переменными, но
a, b = b, a
это самый простой способ . Там естьXOR (для целых чисел)
Или кратко,
Временная переменная
Tuple swap
источник
code
x = x + yy = xy x = xycode
Я бы не сказал, что это стандартный способ обмена, потому что это приведет к неожиданным ошибкам.
nums[i]
будет изменен первым, а затем повлияет на вторую переменнуюnums[nums[i] - 1]
.источник
var c=a
,a=b
,b=c
. И затем последнее назначение будет использовать новое значениеa
для оценки адреса b.nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
, Решил бы проблему.nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
: Проблема в том, что когда python выполняет левостороннее назначение,nums[i]
изменяется, что приводит кnums[nums[i] - 1]
неожиданному изменению. Сначала ты можешь представить, что хочешьnums[1],nums[2] = nums[2],nums[1]
, но послеnums[1] = nums[2]
пробега у тебя больше нетnums[2] = nums[1]
, вместо этого ты получилnums[888] = nums[1]
.Не работает для многомерных массивов, потому что здесь используются ссылки.
См. Также Сменные фрагменты массивов Numpy.
источник
Чтобы обойти проблемы, объясняемые eyquem , вы можете использовать
copy
модуль для возврата кортежа, содержащего (обращенные) копии значений, через функцию:Та же функция, что и
lambda
:Затем присвойте им нужные имена, например:
ПРИМЕЧАНИЕ: если вы хотите, вы можете импортировать / использовать
deepcopy
вместоcopy
.источник
Вы можете комбинировать перестановки кортежей и XOR : x, y = x ^ x ^ y, x ^ y ^ y
или
Используя лямбду :
Вывод:
источник