python - Python函数中多个输出的括号
问题描述
在 matlab 中,如果我们有一个返回多个变量的函数,我们会执行类似的操作
[output1, output2] = some_func()
在 Python 中,你可以简单地做
output1, output2 = some_func()
或者你可以做
[output1, output2] = some_func()
或者
(output1, output2) = some_func()
最后 2 个分别生成一些临时列表和元组,但它没有分配给任何东西,您可以访问与没有[]
or的情况相同的 2 个输出变量()
。除了看起来更优雅之外,使用最后 2 种语法实际上在功能上是否有优势?
解决方案
我能想到的唯一区别
[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
推荐阅读
- c# - 如何在 C# 中从 gridview 或 sql 数据库中进行条件求和
- javascript - Tailwind 模态图像对齐
- kubernetes - Kubernetes 对服务中的副本之一具有不同的环境
- java - 如何使用 microsoft graph api 获取自定义扩展属性
- python - 如何在 Windows 10 家庭版上安装 Tensorflow 和 Keras 库?
- python - 需要根据状态变化进行计数
- typescript - 索引类型的字符串与对象的问题
- stm32 - 对慢速周期性数据使用 DMA 传输有什么限制?
- mongodb - Mongo $group 和 $count,然后 $sort 结果
- excel - SOAPUI - Excel 文件被锁定,因为在 cmd 的任务列表中找不到运行的实例的 excel 进程