Единственное различие, которое я могу вспомнить между
[output1, output2] = some_func()
и
(output1, output2) = some_func()
состоит в том, что объем памяти последнего должен быть меньше (но я уверен, что это деталь реализации ), поскольку кортежи занимают меньше памяти, чем списки с тем же количеством элементов главным образом потому, что кортежи являются неизменяемыми (поэтому интерпретатору не нужно беспокоиться о добавлении или удалении [т.е. перераспределении памяти] элементов).
import sys
print(sys.getsizeof([1, 2]))
print(sys.getsizeof((1, 2)))
print(sys.getsizeof([1, 2, 3, 4]))
print(sys.getsizeof((1, 2, 3, 4)))
print(sys.getsizeof(list(range(1000))))
print(sys.getsizeof(tuple(range(1000))))
# 80
# 64
# 96
# 80
# 9112
# 8048
Сгенерированный байт-код одинаков для всех трех примеров:
from dis import dis
def foo(): return 1, 2
def a():
output1, output2 = foo()
def b():
[output1, output2] = foo()
def c():
(output1, output2) = foo()
dis(a)
print('-----------------------------------------------------')
dis(b)
print('-----------------------------------------------------')
dis(c)
выходы
81 0 LOAD_GLOBAL 0 (foo)
2 CALL_FUNCTION 0
4 UNPACK_SEQUENCE 2
6 STORE_FAST 0 (output1)
8 STORE_FAST 1 (output2)
10 LOAD_CONST 0 (None)
12 RETURN_VALUE
-----------------------------------------------------
85 0 LOAD_GLOBAL 0 (foo)
2 CALL_FUNCTION 0
4 UNPACK_SEQUENCE 2
6 STORE_FAST 0 (output1)
8 STORE_FAST 1 (output2)
10 LOAD_CONST 0 (None)
12 RETURN_VALUE
-----------------------------------------------------
89 0 LOAD_GLOBAL 0 (foo)
2 CALL_FUNCTION 0
4 UNPACK_SEQUENCE 2
6 STORE_FAST 0 (output1)
8 STORE_FAST 1 (output2)
10 LOAD_CONST 0 (None)
12 RETURN_VALUE