#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
>>>