首页 > 解决方案 > Python函数中多个输出的括号

问题描述

在 matlab 中,如果我们有一个返回多个变量的函数,我们会执行类似的操作

[output1, output2] = some_func()

在 Python 中,你可以简单地做

output1, output2 = some_func()

或者你可以做

[output1, output2] = some_func()

或者

(output1, output2) = some_func()

最后 2 个分别生成一些临时列表和元组,但它没有分配给任何东西,您可以访问与没有[]or的情况相同的 2 个输出变量()。除了看起来更优雅之外,使用最后 2 种语法实际上在功能上是否有优势?

标签: pythonmatlab

解决方案


我能想到的唯一区别

[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

对于所有 3 个示例,生成的字节码完全相同:

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

推荐阅读