web-dev-qa-db-ja.com

Python割り当ての破壊

これらの3つの式は同等のようです:

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

彼らは同じコードにコンパイルしますか?

どちらがよりPython的ですか?

47
sds

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であるかについては、やや意見次第ですが、最初のオプションまたは(程度は低いが)2番目のオプションのいずれかを優先します。リストを作成しているように見えるので、角括弧を使用すると混乱します(ただし、そうではないことがわかります)。

61
dano