Скобки вокруг нескольких выходов в функции Python - PullRequest
0 голосов
/ 03 января 2019

В Matlab, если у нас есть функция, которая возвращает несколько переменных, мы делаем что-то вроде

[output1, output2] = some_func()

В Python вы можете просто сделать

output1, output2 = some_func()

Или вы можете сделать

[output1, output2] = some_func()

Или

(output1, output2) = some_func()

Последние 2 составляют некоторый временный список и кортеж, соответственно, но он не назначен ни для чего, и вы можете получить доступ к 2 выходным переменным, идентичным региструбез [] или ().Есть ли что-нибудь функционально выгодное для использования последних 2-х синтаксисов, кроме того, что выглядит немного более элегантно?

1 Ответ

0 голосов
/ 03 января 2019

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

[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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...