2017-03-28 11 views
0

Ich bin ein Netzwerk-Ingenieur, der versucht, Python-Programmierung als Job-Anforderung zu lernen.Python variable Zuweisung ändert Wert

Ich schrieb diesen Code unten an

# Funtion das erste und das letzte Element in der Liste zu hacken

def chop(t): 
    t.pop(0) and t.pop(len(t)-1) 
    return t 

Wenn ich die Funktion auf der Liste t laufen und es zu einer Variablen zuweisen ein. a erhält den Rest der Liste, nachdem die Funktion ausgeführt wurde und eine neue Liste wird. Dies funktioniert perfekt.

>>> t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
>>> a=chop(t) 
>>> a 
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
>>> 

Später, wenn ich versuche, es funktioniert gut, aber der Wert von a ändert sich auch mit dem Ausgang des Druck chop (t), während ich nicht die Variable a durch die Funktion chop (t) ausgeführt haben. Kann jemand erklären, warum das passiert?

>>> print chop(t) 
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 
>>> a 
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 

Grüße Umesh

+3

Sie kopieren Ihre Liste nicht, also beziehen sich 'a' und' t' auf dieselbe Liste. Wenn Sie einen ändern, werden beide verändert. – khelwood

+0

Sie können diesen Artikel hilfreich finden: [Fakten und Mythen über Python Namen und Werte] (http://nedbatchelder.com/text/names.html), die von SO Veteran Ned Batchelder geschrieben wurde. Siehe auch [Andere Sprachen haben "Variablen", Python hat "Namen"] (http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables) für eine Kurze Zusammenfassung mit schönen Diagrammen. –

+0

Sie sollten sich diese SO [Artikel] anschauen (http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list) – latsha

Antwort

0

Beim Aufruf chop (t), t wird als Referenz übergeben. Wenn Sie also die Operation "t.pop (0) und t.pop (len (t) -1)" ausführen, geschieht dies auf dem ursprünglichen Objekt und nicht auf einer Kopie.

Aufgrund der oben, die unten gilt auch

>>> t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
>>> chop(t) 
>>> t 
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] 
>>> 
1

unmodifizierten Liste speichern t, erstellen Kopie davon durch a = t[:] und Testkotelett auf Liste a

>>> t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
>>> a=t[:] 
>>> a.pop(0) 
'a' 
>>> a 
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] 
>>> t 
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] 
>>> 
+0

anstatt "a = t [:]; a.pop (0) 'es ist effizienter,' a = t [1:] 'zu machen. Wenn Sie am Anfang einer Liste springen, müssen alle nachfolgenden Listenelemente nach unten verschoben werden. Das passiert bei C-Geschwindigkeit, also ist es relativ schnell, aber es ist besser, es zu vermeiden, wenn du kannst. –

0
t = ['a', 'b', 'c', 'd', 'e' ,'f','g','h','i','j','k','l'] 
def chop(t): 
    t.pop(0) and t.pop(len(t)-1) 
    return t 
a=chop(t) 

In Python kopiert die Zuweisung niemals Daten. Indem Sie tun a=chop(t) ist wie Einfach den Verweis auf die Funktion in einer Variablen speichern. Daher jedes Mal, wenn wir a aufrufen, erhalten wir chop() Funktion ausgeführt.

Verwandte Themen