Есть ли стандартизированный метод для замены двух переменных в 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