2017-07-18 1 views
4

Für print() mit mehreren Argumenten dachte ich, es wertet sie einzeln aus. Doch der folgende CodeWie wird Python 3 gedruckt (liste, list.pop())?

a = [1, 2, 3, 4] 
print(a, a[:], a.pop(), a, a[:]) 

druckt

[1, 2, 3] [1, 2, 3, 4] 4 [1, 2, 3] [1, 2, 3] 

dachte ich Python a ersten bewerten würde, dann a[:], dann a.pop(), dann a und wieder a[:], die

würde drucken
[1, 2, 3, 4] [1, 2, 3, 4] 4 [1, 2, 3] [1, 2, 3] 

Wie genau funktioniert das?

+0

Relevant: https://stackoverflow.com/questions/42761707/what-is-the-order-of-evaluation-in-python-when-using-pop-list-1-and –

Antwort

5

Wenn Sie eine Funktion aufrufen (eine beliebige Funktion). Die Argumente werden zuerst von links nach rechts ausgewertet. So Ihr Code Äquivalent zu:

arg1 = a 
arg2 = a[:] 
arg3 = a.pop() 
arg4 = a[:] 
print(arg1,arg2,arg3,arg4) 

(natürlich die Variablen arg1, arg2 usw. nicht auf der Python-Ebene existieren)

arg1 wird somit auf derselben Liste beziehen sich a, als nächstes machen wir eine flache Kopie von a und speichern sie in arg2, dann wir pop von a und das letzte Element ist ingespeichert und schließlich machen wir eine weitere flache Kopie (von a an diesem Punkt) und speichern Sie es in arg4.

das bedeutet also, dass:

arg1 = a   # arg1 = a = [1,2,3,4] 
arg2 = a[:]  # arg2 = [1,2,3,4] 
arg3 = a.pop() # arg1 = a = [1,2,3], arg3 = 4 
arg4 = a[:]  # arg4 = [1,2,3] 
print(arg1,arg2,arg3,arg4) 

Als nächstes werden die print(..) Aussage mit diesem Argumente genannt wird und damit gedruckt, wie wir in den Kommentaren zu sehen. So wird es drucken:

[1, 2, 3] [1, 2, 3, 4] 4 [1, 2, 3] 

Der wichtige Teil so ist, dass a.pop() wird nicht nur das letzte Element der Liste sowohl verwies Rückkehr von a und arg1, sondern verändert auch die Liste (das letzte Element entfernen). Als Ergebnis beziehen sich arg1 und a immer noch auf die gleiche Liste, aber es ist modifiziert.

Verwandte Themen