gpt4 book ai didi

python - 解包赋值与链式赋值

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:51 25 4
gpt4 key购买 nike

假设您需要将两个变量初始化为 None。
正在关注 Zen of Python应该使用哪种方式(以及为什么)?
(假设以下方法是您的选择)


解包作业

a, b = None, None  # Explicit

或者
链式赋值

a = b = None # faster. Still readable (perhaps less explicit than unpack?)

“明确更好”的概念似乎适用于任何一种情况。

最佳答案

解包赋值与链式赋值

a, b = None, None  # Explicit

上面的明确的。它明确且不必要地创建了一个额外的数据结构:

a, b = None, None   
#makes (None, None) before unpacking and giving to a and b

相反,进行链式赋值。这也 明确地 做你想做的事,而不做任何不必要的事情。我认为这是该语言的优雅应用:

a = b = None

如果你觉得上面的内容,在其独特的上下文中,过于密集而难以阅读,你也可以毫不羞愧地这样做:

a = None
b = None

反汇编,Python 2 和 3:

import dis

def tupleunpack():
a, b = None, None

def chainedassignment():
a = b = None

def multiline():
a = None
b = None

>>> dis.dis(tupleunpack)
2 0 LOAD_CONST 1 ((None, None))
3 UNPACK_SEQUENCE 2
6 STORE_FAST 0 (a)
9 STORE_FAST 1 (b)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
>>> dis.dis(chainedassignment)
2 0 LOAD_CONST 0 (None)
3 DUP_TOP
4 STORE_FAST 0 (a)
7 STORE_FAST 1 (b)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(multiline)
2 0 LOAD_CONST 0 (None)
3 STORE_FAST 0 (a)

3 6 LOAD_CONST 0 (None)
9 STORE_FAST 1 (b)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE

反汇编演示了元组拆包创建了一个不必要的数据结构。多行不必要地加载 None 两次。就消除不必要的进程而言,链式分配更可取。

性能,Python 3:

元组解包似乎通常也需要稍微多一点的时间:

>>> import timeit
>>> timeit.repeat(tupleunpack)
[0.09981771527421301, 0.10060130717376126, 0.10003051661827556]
>>> timeit.repeat(chainedassignment)
[0.09882977371520241, 0.0981032306866183, 0.0982816216005773]
>>> timeit.repeat(multiline)
[0.09878721344639274, 0.09834682031024045, 0.09854603858978805]

Zen 来证明代码的合理性?

另外,Python 之禅描述了 Python 语言进化的紧张原则。因此,当人们使用它来证明代码合理时,我总是很谨慎。不要试图从一组禅宗格言中获得特定的方向,而是做语言中明确规定的语义正确的事情(例如,在这种情况下,链式赋值。)

关于python - 解包赋值与链式赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34165213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com