Python-Listenverständnis mit Dummy-Namen identisch mit Iterator-Name: schlecht beraten?

8

Sagen Sie, ich mache ein Listenverständnis, das ungefähr so ​​aussieht:

%Vor%

für eine Funktion f . Wird die Verwendung eines Dummy-Namens, der mit dem Iterator identisch ist, jemals zu unerwarteten Ergebnissen führen? Manchmal habe ich Variablennamen, die einzelne Buchstaben sind, und für mich ist es besser, mit demselben Buchstaben zu bleiben, als einen neuen zu vergeben, wie [f(x) for x in x] anstelle von [f(i) for i in x] (zum Beispiel wenn der Buchstabe des Iterators x ist sinnvoll , ich frage mich, was zum Teufel i ist).

    
Luke Davis 01.05.2017, 20:24
quelle

2 Antworten

9

TL; DR: Es ist technisch sicher, aber stilistisch eine schlechte Wahl.

In einem Listenverständnis wird Python vor dem Binden der freien Variablen der for-Schleife an ein Objekt einen GET_ITER -Opcode auf dem iterablen Objekt verwenden, um einen Iterator zu erhalten. Dies geschieht zu Beginn der Schleife nur einmal .

Daher können Sie im Körper der "Schleife" des Listenverständnisses (das in Python 3 tatsächlich einen Gültigkeitsbereich erzeugt) den Namen neu binden, der ursprünglich auf das iterierbare Element ohne jede Konsequenz verweist. Die Iteration behandelt direkt einen Verweis auf den Iterator , und es spielt keine Rolle, ob sie einen Namen im Geltungsbereich hat oder nicht. Das gleiche sollte in Python 2 gelten, obwohl die Details der Scoping-Implementierung unterschiedlich sind: Der Name der Sammlung geht nach dem Verständnis verloren, da der Name der Schleifenvariablen an das letzte Element der Iteration gebunden bleibt.

Es hat keinen Vorteil, den Code auf diese Weise zu schreiben, und er ist weniger lesbar als nur die Namenskollision zu vermeiden. Daher sollten Sie die Sammlung lieber so benennen, dass sie deutlicher sichtbar ist:

%Vor%     
wim 01.05.2017, 20:40
quelle
7
___ qstnhdr ___ Python-Listenverständnis mit Dummy-Namen identisch mit Iterator-Name: schlecht beraten? ___ tag123python3x ___ Python 3 ist die neueste Version der Python-Programmiersprache und wurde am 3. Dezember 2008 offiziell veröffentlicht. Verwenden Sie das allgemeinere [python] -Tag, wenn Ihre Frage nicht versionsspezifisch ist. ___ answer43726205 ___

TL; DR: Es ist technisch sicher, aber stilistisch eine schlechte Wahl.

In einem Listenverständnis wird Python vor dem Binden der freien Variablen der for-Schleife an ein Objekt einen i -Opcode auf dem iterablen Objekt verwenden, um einen Iterator zu erhalten. Dies geschieht zu Beginn der Schleife nur einmal .

Daher können Sie im Körper der "Schleife" des Listenverständnisses (das in Python 3 tatsächlich einen Gültigkeitsbereich erzeugt) den Namen neu binden, der ursprünglich auf das iterierbare Element ohne jede Konsequenz verweist. Die Iteration behandelt direkt einen Verweis auf den Iterator , und es spielt keine Rolle, ob sie einen Namen im Geltungsbereich hat oder nicht. Das gleiche sollte in Python 2 gelten, obwohl die Details der Scoping-Implementierung unterschiedlich sind: Der Name der Sammlung geht nach dem Verständnis verloren, da der Name der Schleifenvariablen an das letzte Element der Iteration gebunden bleibt.

Es hat keinen Vorteil, den Code auf diese Weise zu schreiben, und er ist weniger lesbar als nur die Namenskollision zu vermeiden. Daher sollten Sie die Sammlung lieber so benennen, dass sie deutlicher sichtbar ist:

%Vor%     
___ tag123listcomprehension ___ Ein syntaktisches Konstrukt, das eine übersichtliche Methode zum Erstellen von Listen in einem ähnlichen Stil wie die mathematische Set-Builder-Notation bietet. Verwenden Sie dieses Tag in Verbindung mit dem Tag der Programmiersprache, die Sie für Fragen zum Erstellen neuer Listen mit Listenergänzungen verwenden. ___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123dictionarycomprehension ___ Ein syntaktisches Konstrukt, das einen übersichtlichen Weg zum Erstellen von Wörterbüchern bietet. ___ antwort43726231 ___

Sie können zwar doppelte Namen verwenden, weil Python Listen-Comprehensions ausführt - sogar verschachtelte Listen-Comprehensions -   tue das nicht . Es scheint Ihrer Meinung nach besser lesbar, aber für die meisten Menschen wäre es sehr verwirrend.

Dies führt jedoch zu einem viel wichtigeren Punkt. Warum sollte ein Name wie j , x oder _ überhaupt verwendet werden? Die Verwendung von Variablennamen mit einem Buchstaben verursacht Verwirrung und ist mehrdeutig. Verwenden Sie stattdessen einen Variablennamen, der Ihre Absicht deutlich vermittelt.

Oder, wenn Sie überhaupt keine Notwendigkeit für die Werte in der iterable Ihre Iteration durch (z. B. Sie wollen einfach einen Block des Codes eine bestimmte Anzahl von Zeiten wiederholen), verwenden Sie eine "Wegwerf" Variable, %code% , um dem Leser Ihres Codes mitzuteilen, dass der Wert nicht wichtig ist und ignoriert werden sollte.

Verwenden Sie jedoch keine nicht beschreibenden doppelten Namen aus einem Buchstaben. Das wird nur dazu dienen, zukünftige Leser Ihres Codes zu verwirren, Ihre Absicht unklar zu machen und Code zu erstellen, der schwer zu warten und zu debuggen ist.

Weil Sie am Ende lieber Code wie diesen pflegen würden

%Vor%

oder das?

%Vor%     
___ qstntxt ___

Sagen Sie, ich mache ein Listenverständnis, das ungefähr so ​​aussieht:

%Vor%

für eine Funktion %code% . Wird die Verwendung eines Dummy-Namens, der mit dem Iterator identisch ist, jemals zu unerwarteten Ergebnissen führen? Manchmal habe ich Variablennamen, die einzelne Buchstaben sind, und für mich ist es besser, mit demselben Buchstaben zu bleiben, als einen neuen zu vergeben, wie %code% anstelle von %code% (zum Beispiel wenn der Buchstabe des Iterators %code% ist sinnvoll , ich frage mich, was zum Teufel %code% ist).

    
___
Christian Dean 01.05.2017 20:42
quelle