在matlab中,如果我们有一个返回多个变量的函数,我们会做类似的事情
output1, output2 = some_func()
在Python中,您可以轻松完成
[output1, output2] = some_func()
或者您可以
(output1, output2) = some_func()
或
[]
最后2个分别构成一些临时列表和元组,但未分配任何内容,并且可以访问两个输出变量,它们与没有()
或{{1}}的情况相同。除了看起来稍微更优雅之外,使用最后两种语法在功能上实际上是否有什么优势?
答案 0 :(得分:4)
我能想到的唯一区别
[output1, output2] = some_func()
和
(output1, output2) = some_func()
是后者的内存占用应该 较小(但我确定这是implementation detail),因为元组所占用的内存要少于具有相同数量元素的列表所占用的内存,主要是因为元组是不可变的(所以解释器不必担心添加或删除[即重新分配内存]元素)。
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