Есть ли стандартизированный метод для замены двух переменных в Python?
в Python я видел, как два значения переменных поменялись с помощью этого синтаксиса:
left, right = right, left
считается ли это стандартным способом замены двух значений переменных или есть какие-то другие средства, с помощью которых две переменные по соглашению чаще всего меняются местами?
5 ответов
Python оценивает выражения слева направо. Обратите внимание, что в то время как оценивая назначение, правая сторона оценивается перед левая сторона.
http://docs.python.org/3/reference/expressions.html#evaluation-order
это означает следующее для выражения a,b = b,a
:
- правой , то есть создается кортеж из двух элементов в памяти. Два элемента являются объектами, обозначенными идентификаторами
b
иa
, которые существовали до того, как инструкция окружена во время выполнения программы - сразу после создания этого кортежа назначение этого объекта кортежа еще не было сделано, но это не имеет значения, Python внутренне знает, где он находится
- затем оценивается левая сторона, то есть кортеж присваивается левой стороне
- as левая сторона состоит из двух идентификаторов, кортеж распаковывается для того, чтобы первый идентификатор
a
присваивается первому элементу кортежа (который является объектом, который был formely b перед свопом, потому что у него было имяb
)
и второй идентификаторb
присвоен второй элемент кортежа (который является объектом, который ранее был a перед свопом, потому что его идентификаторы былиa
)
этот механизм эффективно поменял местами объекты, назначенные идентификаторам a
и b
Итак, чтобы ответить на ваш вопрос: Да, это стандартный способ поменять два идентификатора на два объекта.
Кстати, объекты не являются переменными, они являются объектами.
Я знаю три способа замены переменных, а a, b = b, a
это самый простой. Есть
XOR (для целых чисел)
x = x ^ y
y = y ^ x
x = x ^ y
или сжато,
x ^= y
y ^= x
x ^= y
временная переменная
w = x
x = y
y = w
del w
Кортеж замены
x, y = y, x
Я бы не сказал, что это стандартный способ замены, потому что это вызовет некоторые неожиданные ошибки.
nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
nums[i]
сначала будет изменен, а затем повлияет на вторую переменную nums[nums[i] - 1]
.
не работает для многомерных массивов, поскольку здесь используются ссылки.
import numpy as np
# swaps
data = np.random.random(2)
print(data)
data[0], data[1] = data[1], data[0]
print(data)
# does not swap
data = np.random.random((2, 2))
print(data)
data[0], data[1] = data[1], data[0]
print(data)
см. также поменять местами ломтики массивов Numpy