4

Почему получаются разные результаты в 2-х случаях?

Пример 1:

A = 1
B = 2
C = 3
D = 4
E = 5
F = 6

A,B,C,D = E,F,A,B
print A,B,C,D,E,F

Результат 1:

5 6 1 2 5 6

Пример 2:

A = 1
B = 2
C = 3
D = 4
E = 5
F = 6

A = E
B = F
C = A
D = B

print A,B,C,D,E,F

Результат 2:

5 6 5 6 5 6

В каком порядке, в первом примере происходит присвоение переменных?

  • В таком порядке всё правильно: C = A; D = B; A = E; B = F. Но почему? – Denis Leonov Jan 13 '17 at 17:58
  • эм... а что не так во 2 случае? абсолютно логичное поведение. – pavel Jan 13 '17 at 17:59
  • Да просто операция A,B,C,D = E,F,A,B видимо проводится интерпретатором в своём неведомом порядке. Странно – Denis Leonov Jan 13 '17 at 18:02
  • 1
    @Denis, почему же? Последовательно с конца. Другой вопрос, стандартизировано ли это поведение между версиями интерпретатора или нет. – 0andriy Jan 13 '17 at 18:30

1 Answers1

12

E,F,A,B даёт кортеж (5,6,1,2), который к оригинальным переменным уже не имеет никакого отношения и никак с ними не связан.

foo = E,F,A,B
print(foo)  # => (5, 6, 1, 2)
E = -777
print(foo)  # всё ещё => (5, 6, 1, 2)

Синтаксис A,B,C,D = — это распаковка (в данном случае кортежа) — последовательно присваивает переменным значения из списка, кортежа или любого другого итерируемого объекта (можно поставить = range(4), например), стоящего после знака равно. А тот кортеж, который стоит справа, уже не имеет к оригинальным переменным никакого отношения. То есть получается что-то вроде:

A,B,C,D = (5,6,1,2)

Во втором случае код просто выполняется последовательно как есть и меняет переменные, надеюсь он в пояснениях не нуждается)

Ещё примеров:

a, b, c = [1, 2, 3]  # a = 1, b = 2, c = 3
a, b, c = range(3)  # a = 0, b = 1, c = 2
a, b, *l, c = range(5)  # a = 0, b = 1, l = [2, 3], c = 4

Пример со своим генератором:

def gen():
    yield int(input('Первое число: '))
    yield int(input('Второе число: '))

a, b = gen()
print(a, b)

Даст:

Первое число: 3
Второе число: 4
3 4
andreymal
  • 13,178