Warum funktioniert var = [0] .extend (Bereich (1,10)) nicht in Python?

7

Ich würde denken, dass, wenn ich den folgenden Code in Python gemacht habe

%Vor%

then var wäre eine Liste mit den Werten 0 - 9 drin.

Was gibt's?

    
Micah 20.07.2012, 21:19
quelle

4 Antworten

3

Wie Oscar López und andere bereits erklärt haben, ist extend ein Befehl, der None zurückgibt, um die Trennung von Befehlen und Abfragen einzuhalten.

Sie haben alle vorgeschlagen, dies zu beheben, indem Sie wie gewünscht extend als Befehl verwenden. Aber es gibt eine Alternative: Verwenden Sie stattdessen eine Abfrage:

%Vor%

Es ist wichtig, den Unterschied hier zu verstehen. extend ändert Ihre [0] und verwandelt sie in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] . Aber der Operator + lässt Ihre [0] allein und gibt eine neue Liste [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] zurück.

In Fällen, in denen Sie andere Verweise auf die Liste haben und sie alle ändern möchten, benötigen Sie natürlich extend .

Wenn Sie jedoch nur [0] als Wert verwenden, können Sie mit + nicht nur kompakten, flüssigen Code schreiben (wie Sie es versuchten), sondern auch mutierende Werte vermeiden. Dies bedeutet, dass derselbe Code funktioniert, wenn Sie unveränderliche Werte (wie Tupel) anstelle von Listen verwenden, aber wichtiger ist, dass dies für einen Stil der funktionalen Programmierung wichtig ist, der Nebenwirkungen vermeidet. (Es gibt viele Gründe, warum dieser Stil nützlich ist, aber eine offensichtliche ist, dass unveränderliche Objekte und Funktionen ohne Nebenwirkungen von Natur aus threadsicher sind.)

    
abarnert 20.07.2012, 22:12
quelle
10

list.extend ist ein In-Place Methode. Es führt seine Aktion für das Objekt selbst aus und gibt None zurück.

Das würde funktionieren:

%Vor%

Noch besser wäre das:

%Vor%     
orlp 20.07.2012 21:21
quelle
6

extend () gibt nichts zurück (tatsächlich None ), es macht die Änderung "in -place ", dh die Liste selbst ist modifiziert.

Ich denke, Sie sind danach:

%Vor%     
Levon 20.07.2012 21:22
quelle
4

Damit der Code in der Frage funktioniert, müssen Sie Folgendes tun:

%Vor%

Es hat vorher noch nicht funktioniert, weil extend () None zurückgibt, und zwar per Entwurf: Python hält sich an Befehl / Abfrage Trennung .

    
Óscar López 20.07.2012 21:23
quelle

Tags und Links