2016-06-03 7 views
2
x = func(*(xa,) + args) 
y = func(*((xc,) + args)) 

wo args ist ein Array und Funktionsdefinition ist:Was ist der Unterschied zwischen den folgenden beiden Aussagen?

def func(lamb, data): 
    # statements 

Ich lernte über *args, aber ich konnte den genauen Unterschied zwischen diesen Zeilen nicht finden.

+5

ein extra Satz Klammern. Das ist es, es gibt keinen Unterschied in der Ausführung, der Byte-Code ist identisch: 'dis.dis (" func (* (xa,) + args) ")' gibt die gleichen Operationen wie 'dis.dis (" func (* ((xc,) + args)) ")' –

+4

auch die erste verwendet 'xa', während die zweite' xc';) –

+1

Wenn die Funktion, die Sie versuchen zu rufen, zwei Argumente braucht und Sie zwei Argumente warum übergeben wollen nimmst du überhaupt die "* args" -Mechanik? Möchtest du nicht einfach 'func (xa, args)' machen? –

Antwort

5

Der einzige Unterschied ist der zusätzliche Satz von Klammern und verwendet man xa, während die andere xc verwendet, sondern auch, dass viel Unterschied nicht to the byte code machen, werfen Sie einen Blick:

# python 2 needs to use dis.dis(compile("func(*(xa,)+args)","","eval")) 
# to get same result, see http://stackoverflow.com/questions/12673074/how-should-i-understand-the-output-of-dis-dis 
>>> dis.dis("func(*(xa,)+args)") 
    1   0 LOAD_NAME    0 (func) 
       3 LOAD_NAME    1 (xa) 
       6 BUILD_TUPLE    1 
       9 LOAD_NAME    2 (args) 
      12 BINARY_ADD 
      13 CALL_FUNCTION_VAR  0 (0 positional, 0 keyword pair) 
      16 RETURN_VALUE 
>>> dis.dis("func(*((xc,)+args))") 
    1   0 LOAD_NAME    0 (func) 
       3 LOAD_NAME    1 (xc) 
       6 BUILD_TUPLE    1 
       9 LOAD_NAME    2 (args) 
      12 BINARY_ADD 
      13 CALL_FUNCTION_VAR  0 (0 positional, 0 keyword pair) 
      16 RETURN_VALUE 

Dies ist ein einfach eine Frage der precedence erfolgt die Zugabe Vorrang vor den * Auspacken (CALL_FUNCTION_VAR ist die genaue Bytecode verwendet) so Klammern Zugabe nicht alles ändern, ähnlich wie hier:

3 * 5 + 1 

Die Multiplikation wird passieren zuerst so Zugabe Klammern um es:

(3 * 5) + 1 

ändert sich nicht, was passieren wird.


Beachten Sie auch, dass Sie müssen nicht Tupel zusammen hinzufügen, wenn Argumente ausgepackt haben, können Sie genauso gut tun:

func(xa, *args) 

das gleiche Ergebnis zu erreichen, ohne Tupel zusammen fügen, die (und dies funktioniert, wenn args etwas anderes als ein Tupel ist, wo Ihre Version einen TypeError auslösen würde)

Verwandte Themen