Wie kann ich umgehen, eine nicht verwendete Variable in einer for-Schleife zu deklarieren?

85

Wenn ich (zum Beispiel) ein Listenverständnis wie dieses habe:

['' for x in myList]

Wenn ich effektiv eine neue Liste erstelle, die für jedes Element in einer Liste eine leere Zeichenfolge enthält, verwende ich niemals die x. Gibt es eine sauberere Schreibweise, damit ich die nicht verwendete xVariable nicht deklarieren muss ?

Ramy
quelle

Antworten:

129

_ ist ein Standard-Platzhaltername für ignorierte Mitglieder in einer for-Schleifen- und Tupelzuweisung, z

['' for _ in myList]

[a+d for a, _, _, d, _ in fiveTuples]

Übrigens könnte Ihre Liste ohne Listenverständnis geschrieben werden (vorausgesetzt, Sie möchten eine Liste unveränderlicher Mitglieder wie Zeichenfolgen, Ganzzahlen usw. erstellen).

[''] * len(myList)
kennytm
quelle
9
Letzteres muss von einer großen Warnung begleitet sein, dass es für veränderliche Objekte nicht das Erwartete tut.
5
@Mohit:a=[[]]*4;a[0].append(5);print(a)
Kennytm
@Ramy: Mohit hat eine Erklärung gepostet, die jedoch gelöscht wurde: S Wie auch immer, überprüfen Sie Notes 2 in docs.python.org/py3k/library/… .
Kennytm
2
@Ramy, Python behält dieselbe Referenz für dasselbe Objekt im Speicher bei.
Mohit Ranka
Ist es wichtig, wenn ich forzum Beispiel verschachtelte Schleifen mache ? Oder wenn for _ in range(...)ich drinnen sagen will _, var = f(x)? Wird es zwischen den beiden _Variablen verwechselt ?
Eric Auld
19

Nein. Wie der Zen es ausdrückt: Sonderfälle sind nicht speziell genug, um die Regeln zu brechen. Der Sonderfall sind Schleifen, bei denen die Elemente des zu iterierenden Objekts nicht verwendet werden, und die Regel lautet, dass ein "Ziel" zum Entpacken vorhanden ist.

Sie können jedoch einen _Variablennamen verwenden, der normalerweise als "absichtlich nicht verwendet" verstanden wird (selbst PyLint usw. weiß dies und respektiert dies).

Stange
quelle
PyLint beschwert sich jedoch darüber, es C: 10,24: Invalid variable name "_" (invalid-name)sei denn, Sie fügen es good-namesin Ihrem hinzu .pylintrc.
Giorgiosironi
12

Es stellt sich heraus, dass die Verwendung dummy*(Startwort ist Dummy) als Variablenname den gleichen Trick wie _. _ist ein bekannter Standard und es wäre besser, aussagekräftige Variablennamen zu verwenden. So Sie verwenden können dummy, dummy1, dummy_anything. Durch die Verwendung dieser Variablennamen PyLintwird nicht beanstandet.

Alfred
quelle
Ich bevorzuge diesen Ansatz. es bleibt sinnvoll.
RvdK
2

Fügen Sie nach der for-Schleife in derselben Zeile den folgenden Kommentar hinzu:

#pylint: disable = unbenutzte Variable

for i in range(100): #pylint: disable=unused-variable
Christopher Nuzzi
quelle
1

Wenn Sie Ihre Argumente benennen müssen (z. B. wenn Sie Mocks schreiben, die bestimmte Argumente nicht verwenden, auf die namentlich verwiesen wird), können Sie diese Verknüpfungsmethode hinzufügen:

def UnusedArgument(_):
  pass

und dann benutze es so

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)
kateroh
quelle
0

Die Generatorobjekte verwenden die Variablen nicht wirklich. Also so etwas wie

list(('' for x in myList))

sollte den Trick machen. Beachten Sie, dass x nicht als Variable außerhalb des Generatorverständnisses definiert ist.

grosse Bandbreite
quelle
0

Sie können auch einen Variablennamen voranstellen, _wenn Sie der Variablen lieber einen lesbaren Namen geben möchten. Zum Beispiel können Sie verwenden _foo, _foo1, _anythingund PyLint nicht beschweren. In einer for-Schleife wäre es wie folgt:

for _something in range(10):
    do_something_else()

bearbeiten: Beispiel hinzufügen

Adam Scharf
quelle
0

Ein ausführlicher Weg ist:

newList = []
while len(newList) < len(mylist):
    newList.append('')

Sie vermeiden es, eine verwendete Variable auf diese Weise zu deklarieren.

Sie können auch veränderbare und unveränderliche Objekte (wie Wörterbücher) anhängen newList.

Eine andere Sache für Python-Neulinge wie mich, '_', 'Dummy', sind etwas beunruhigend.

James Barton
quelle
-1

Kommentar zu Wie kann ich umgehen, dass eine nicht verwendete Variable in einer for-Schleife deklariert wird? (Keine Kommentargröße mehr)

Python behält dieselbe Referenz für das erstellte Objekt bei. (unabhängig von der Veränderlichkeit), zum Beispiel

In [1]: i = 1

In [2]: j = 1

In [3]: id(i)
Out[3]: 142671248

In [4]: id(j)
Out[4]: 142671248

Sie können sowohl i als auch j sehen und sich auf dasselbe Objekt im Speicher beziehen. Was passiert, wenn wir den Wert einer unveränderlichen Variablen ändern?

In [5]: j = j+1

In [6]: id(i)
Out[6]: 142671248

In [7]: id(j)
Out[7]: 142671236

Sie können sehen, dass j jetzt beginnt, auf einen neuen Ort zu zeigen (wo 2 gespeichert ist), und i zeigt immer noch auf den Ort, an dem 1 gespeichert ist. Während der Bewertung

j = j+1

Der Wert wird aus 142671248 ausgewählt, berechnet (falls nicht bereits zwischengespeichert) und an einer neuen Position 142671236 abgelegt. J zeigt auf die neue Position. Einfacher ausgedrückt wird eine neue Kopie erstellt, die jedes Mal erstellt wird, wenn eine unveränderliche Variable geändert wird.

Wandlungsfähigkeit

Veränderliche Objekte verhalten sich in dieser Hinsicht kaum anders. Wenn der Wert durch zeigt

In [16]: a = []

In [17]: b = a

In [18]: id(a)
Out[18]: 3071546412L

In [19]: id(b)
Out[19]: 3071546412L

Sowohl a als auch b zeigen auf denselben Speicherort.

In [20]: a.append(5)

Der Speicherort, auf den a zeigt, wird geändert.

In [21]: a
Out[21]: [5]

In [22]: b
Out[22]: [5]

In [23]: id(a)
Out[23]: 3071546412L

In [24]: id(b)
Out[24]: 3071546412L

Sowohl a als auch b zeigen immer noch auf denselben Speicherort. Mit anderen Worten, veränderbare Variablen wirken auf denselben Speicherort, auf den die Variable zeigt, anstatt eine Kopie des Werts zu erstellen, auf den die Variable zeigt, wie im Fall einer unveränderlichen Variablen.

Mohit Ranka
quelle
Danke dafür, aber ich bin mir wirklich nicht sicher, was es mit der Frage zu tun hat. (Nein, ich habe nicht abgelehnt)
Ramy