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)
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)) ")' –
auch die erste verwendet 'xa', während die zweite' xc';) –
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? –