Hinzufügen einer Zeichenfolge zu einer Liste

7
%Vor%

Was passiert hier? Das sollte nicht funktionieren, oder? oder fehlt mir etwas offensichtlich?

%Vor%

Dann ist a += b nicht immer äquivalent zu a = a + b ?

    
joaquin 30.11.2011, 08:02
quelle

7 Antworten

12

Strings sind iterierbar: Die Elemente sind die Zeichen der Zeichenfolge. Wenn Sie einer Liste einen iterierbaren Wert hinzufügen, werden die -Elemente des Iterablen an die Liste angehängt.

Einer der folgenden Schritte wird das ausführen, was Sie erwarten (z. B. die Zeichenfolge anhängen und die Liste nicht mit den Zeichen der Zeichenfolge erweitern):

%Vor%

oder

%Vor%     
NPE 30.11.2011 08:04
quelle
9

Der Operator += erweitert eine Liste, anstatt sie anzuhängen:

%Vor%     
Tim Pietzcker 30.11.2011 08:04
quelle
3

Dies ist eine Antwort nicht auf die ursprüngliche Frage (die meiner Meinung nach ausreichend beantwortet wurde), sondern auf die zahlreichen Fragen, die in den Kommentaren zur Semantik der erweiterten Zuweisung ( += und ähnliche Operationen) gestellt wurden / p>

Kurz gesagt: Die erweiterte Zuweisung funktioniert bei veränderlichen Typen anders als bei unveränderlichen Typen.

str , tuple , und die numerischen Typen sind unter anderem unveränderlich. Der Inhalt eines Tupels kann nach der Erstellung nicht mehr geändert werden. Sie erhalten dieses Verhalten:

%Vor%

str hat dieselbe Semantik. Grundsätzlich ist a += b äquivalent zu a = a + b , wenn a unveränderlich ist.

Die meisten anderen Typen, einschließlich list , sind veränderbar. Der Inhalt einer Liste kann vor Ort geändert werden, und die erweiterte Zuweisung macht genau das. Daher:

%Vor%

Wenn die dritte Zeile durch a = a + [3, 4] ersetzt wurde, wurde eine neue Liste erstellt und b wäre [1, 2] .

Für eine benutzerdefinierte Klasse hängt die Semantik davon ab, wie sie implementiert wurde, aber so soll es pro PEP 203 gemacht werden.

    
Taymon 01.12.2011 00:45
quelle
2

Eine Zeichenfolge ist eine Zeichenfolge. Die Listenoperation += nimmt eine beliebige Sequenz und hängt jedes der Elemente der Sequenz an die Liste an.

(Tatsächlich nimmt += alle iterierbaren Werte an.)

    
rob mayoff 30.11.2011 08:04
quelle
2

+ = ist syntaktischer Zucker für die Erweiterung, aber + ist nur Listenverkettung. Wenn Sie erweitern, durchlaufen Sie das Argument, das in diesem Fall eine Zeichenfolge ist. Aber Sie können eine Zeichenfolge nicht mit einer Liste verketten, daher schlägt + fehl.

    
Philip Uren 30.11.2011 08:12
quelle
0

Was hast du erwartet? Wenn Sie c als Zeichenfolge hinzufügen möchten, müssen Sie Folgendes tun:

%Vor%

Prost!

    
ocell 30.11.2011 08:07
quelle
0

Im Wesentlichen wird der Operator + = in der Liste den Iterator von c abrufen, der die einzelnen Zeichen in der richtigen Reihenfolge ergibt. Wenn Sie beabsichtigen, die tatsächliche Zeichenfolge der Liste hinzuzufügen und das Ergebnis ['1234'] zu erhalten, können Sie stattdessen b.append ('1234') verwenden.

    
David Burström 30.11.2011 08:10
quelle

Tags und Links