从返回中打开两次包装的简洁方法



这可能是一个愚蠢的问题,但我无法从搜索中找到任何内容。

我知道如果我想将返回的元组解压缩为多个变量,语法是A,B = myfunction()

如果我的函数返回列表元组,例如( [1], [2] ),并且我想为我的变量分配整数12而不是列表[1][2]怎么办?是否有速记一行,或者我需要做

A, B = myfunction()
A = A[0]
B = B[0]

提前感谢您的帮助。

使用相同的结构:

[A], [B] = myfunction()

演示:

>>> def myfunction():
return ( [1], [2] )
>>> [A], [B] = myfunction()
>>> A
1
>>> B
2

关于DeepSpace的评论">这将创建2个新列表">:它没有:

>>> import dis
>>> dis.dis('[A], [B] = myfunction()')
1           0 LOAD_NAME                0 (myfunction)
2 CALL_FUNCTION            0
4 UNPACK_SEQUENCE          2
6 UNPACK_SEQUENCE          1
8 STORE_NAME               1 (A)
10 UNPACK_SEQUENCE          1
12 STORE_NAME               2 (B)
14 LOAD_CONST               0 (None)
16 RETURN_VALUE

创建列表的样子如下:

>>> dis.dis('[A]')
1           0 LOAD_NAME                0 (A)
2 BUILD_LIST               1
4 RETURN_VALUE

背景很重要。

使用参数,以便可以从外部控制索引。

def myfunction(a_index=None, b_index=None):
...
if a_index is None and b_index is None:
return a, b
return a[a_index], b[b_index]

然后

A, B = myfunction(0, 0)

这是一个可重用的解决方案。如果需要其他索引:

A, B = myfunction(2, 1)

这不支持混合(即仅传递a_indexb_index(,但如果您需要该行为,您可以轻松添加它。

实现此结果的方法之一是展平数据。我会按照以下方式做:

def myfunction():
return ([1],[2])
A,B = (i[0] for i in myfunction())
print(A)  # 1
print(B)  # 2

Python 中还有其他扁平化方法,但对于您的情况下使用的 2D 结构(列表元组(,for完全足够了。

最新更新