假设您需要将两个变量初始化为None
遵循Zen of Python应该使用哪种方式(以及为什么)?
(假设您可以选择以下方法)
解包分配
a, b = None, None # Explicit
或
链式分配
a = b = None # faster. Still readable (perhaps less explicit than unpack?)
明确的概念更好"似乎它适用于任何一种情况。
答案 0 :(得分:2)
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
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
反汇编表明元组解包会创建不必要的数据结构。 多线不必要地加载无两次。在消除不必要的过程方面,链式分配是优选的。
元组拆包似乎通常需要稍微多一点的时间:
>>> 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]
此外,Python的Zen描述了Python语言发展的紧张原则。因此,当人们用它来证明代码的合理性时,我总是很谨慎。不要试图从禅宗格言的集合中获取具体的方向,而是在语言中明确提供语义上正确的事情(例如,在这种情况下,链式赋值。)