web-dev-qa-db-fra.com

Python déstructuration d'affectation

Ces trois expressions semblent équivalentes:

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

Compilent-ils dans le même code?

Lequel est le plus pythonique?

47
sds

Selon dis, ils sont tous compilés dans le même bytecode:

>>> 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        

Ils devraient donc tous avoir la même efficacité. Pour ce qui est le plus Pythonic, c'est un peu à la baisse, mais je préférerais la première ou (dans une moindre mesure) la deuxième option. L'utilisation des crochets est source de confusion car il semble que vous créez une liste (bien qu'il s'avère que vous ne l'êtes pas).

61
dano