Разница в методах определения двух переменных одновременно в python

#python #variables

#python #переменные

Вопрос:

Я заметил, что в python вы можете сделать две вещи, чтобы выполнить двойное присваивание:

 hey,bye = (1,2)

#or

(hey,bye)=(1,2)
  

Есть ли какая-либо реальная разница между ними?

Комментарии:

1. Нет, обычно кортеж составляют запятые

2. @MadPhysicist Это ни в каком смысле не кортеж, не так ли? Я имею в виду, что это не создает tuple объект, а также в грамматике говорится о «целевых списках «.

Ответ №1:

Нет, это группирующие скобки, которые не влияют на то, как работает этот оператор. Вы можете проверить, что они генерируют байт-код каждой из них, и он точно такой же:

 >>> import dis
>>> dis.dis("hey,bye = (1,2)")
  1           0 LOAD_CONST               0 ((1, 2))
              2 UNPACK_SEQUENCE          2
              4 STORE_NAME               0 (hey)
              6 STORE_NAME               1 (bye)
              8 LOAD_CONST               1 (None)
             10 RETURN_VALUE
>>> dis.dis("(hey,bye) = (1,2)")
  1           0 LOAD_CONST               0 ((1, 2))
              2 UNPACK_SEQUENCE          2
              4 STORE_NAME               0 (hey)
              6 STORE_NAME               1 (bye)
              8 LOAD_CONST               1 (None)
             10 RETURN_VALUE
  

Обратите внимание, скобки могут иметь значение, если у вас есть вложенные данные:

 >>> data = [1,2, [3, 4]]
>>> x, y, (z, w) = data
>>> x,y,z,y
(1, 2, 3, 2)
>>> x, y, z, w  = data
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 4, got 3)
  

Итак, обратите внимание на разницу в этом байт-коде:

 >>> dis.dis("x, y, (z, w) = data")
  1           0 LOAD_NAME                0 (data)
              2 UNPACK_SEQUENCE          3
              4 STORE_NAME               1 (x)
              6 STORE_NAME               2 (y)
              8 UNPACK_SEQUENCE          2
             10 STORE_NAME               3 (z)
             12 STORE_NAME               4 (w)
             14 LOAD_CONST               0 (None)
             16 RETURN_VALUE
>>> dis.dis("x, y, z, w = data")
  1           0 LOAD_NAME                0 (data)
              2 UNPACK_SEQUENCE          4
              4 STORE_NAME               1 (x)
              6 STORE_NAME               2 (y)
              8 STORE_NAME               3 (z)
             10 STORE_NAME               4 (w)
             12 LOAD_CONST               0 (None)
             14 RETURN_VALUE
>>>