Python赋值解构

52

这三个表达似乎是等价的:

a,b,c = line.split()
(a,b,c) = line.split()
[a,b,c] = line.split()

它们编译成相同的代码吗?

哪一个更符合Pythonic风格?


1
你需要为 [[a]] = b 进行某种分组,例如 ((a,),) = b 也不是特别好看。至于哪个更易读,当这不是必要的时候,就由你决定了。 - Ry-
1个回答

66

dis所述,它们都被编译成相同的字节码:

>>> def f1(line):
...  a,b,c = line.split()
... 
>>> def f2(line):
...  (a,b,c) = line.split()
... 
>>> def f3(line):
...  [a,b,c] = line.split()
... 
>>> import dis
>>> dis.dis(f1)
  2           0 LOAD_FAST                0 (line)
              3 LOAD_ATTR                0 (split)
              6 CALL_FUNCTION            0
              9 UNPACK_SEQUENCE          3
             12 STORE_FAST               1 (a)
             15 STORE_FAST               2 (b)
             18 STORE_FAST               3 (c)
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE        
>>> dis.dis(f2)
  2           0 LOAD_FAST                0 (line)
              3 LOAD_ATTR                0 (split)
              6 CALL_FUNCTION            0
              9 UNPACK_SEQUENCE          3
             12 STORE_FAST               1 (a)
             15 STORE_FAST               2 (b)
             18 STORE_FAST               3 (c)
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE        
>>> dis.dis(f3)
  2           0 LOAD_FAST                0 (line)
              3 LOAD_ATTR                0 (split)
              6 CALL_FUNCTION            0
              9 UNPACK_SEQUENCE          3
             12 STORE_FAST               1 (a)
             15 STORE_FAST               2 (b)
             18 STORE_FAST               3 (c)
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE        

因此,它们都应该具有相同的效率。至于哪个更符合Pythonic风格,这在一定程度上取决于个人观点,但我会更倾向于第一个选项或者(稍微)第二个选项。使用方括号很容易让人困惑,因为看起来像是在创建列表(尽管事实并非如此)。


4
哪个更符合Pythonic?我会说第一个选项,因为它的语法更简洁,更易读。 - Casey Falk
1
@Kevin 至少在 Python 3.2 上是一样的(这是我现在能访问到的所有内容)。 - dano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接