Вопрос-Ответ

Multiple assignment and evaluation order in Python

Множественное назначение и порядок оценки в Python

В чем разница между следующими выражениями Python:

# First:

x,y = y,x+y

# Second:

x = y
y = x+y

Первый дает другие результаты, чем Второй.

например,

Первый:

>>> x = 1
>>> y = 2
>>> x,y = y,x+y
>>> x
2
>>> y
3

Второй:

>>> x = 1
>>> y = 2
>>> x = y
>>> y = x+y
>>> x
2
>>> y
4

y равно 3 в Первом и 4 во втором

Переведено автоматически
Ответ 1

В операторе присваивания правая часть всегда оценивается полностью перед выполнением фактической настройки переменных. Итак,

x, y = y, x + y

вычисляет y (давайте назовем результат ham), вычисляет x + y (назовем это spam), затем устанавливает x в ham и y в spam. Т.е. Это как

ham = y
spam = x + y
x = ham
y = spam

В отличие от,

x = y
y = x + y

устанавливает x в y, затем устанавливает y в x (который == y) плюс y, так что это эквивалентно

x = y
y = y + y
Ответ 2

Это объясняется в документации в разделе, озаглавленном "Порядок оценки":


... при оценке назначения правая часть вычисляется раньше левой.


Ответ 3

Первое выражение:


  1. Создает временный кортеж со значением y,x+y

  2. Назначается другому временному кортежу

  3. Извлеките кортеж из переменных x и y

Второй оператор на самом деле представляет собой два выражения, без использования кортежа.

Сюрприз в том, что первое выражение на самом деле:

temp=x
x=y
y=temp+y

Вы можете узнать больше об использовании запятой в "Формах, заключенных в скобки".

Ответ 4

Также замечание относительно левой части: порядок назначений гарантированно соответствует порядку их появления, другими словами:

a, b = c, d

функционально эквивалентен точному (помимо создания t):

t = (c, d)
a = t[0] # done before 'b' assignment
b = t[1] # done after 'a' assignment

Это имеет значение в таких случаях, как назначение атрибута объекта, например:

class dummy:
def __init__(self): self.x = 0

a = dummy(); a_save = a
a.x, a = 5, dummy()
print(a_save.x, a.x) # prints "5 0" because above is equivalent to "a = dummy(); a_save = a; t = (5, dummy()); a.x = t[0]; a = t[1]"

a = dummy(); a_save = a
a, a.x = dummy(), 5
print(a_save.x, a.x) # prints "0 5" because above is equivalent to "a = dummy(); a_save = a; t = (dummy(), 5); a = t[0]; a.x = t[1]"

Это также подразумевает, что вы можете выполнять такие вещи, как создание объекта и доступ к нему, используя однострочники, например:

class dummy:
def __init__(self): self.x = 0
# Create a = dummy() and assign 5 to a.x
a, a.x = dummy(), 5
2023-04-23 14:11 python