max ([x für x in etwas]) vs max (x für x in etwas): Warum gibt es einen Unterschied und was ist das?

Bob:

Ich habe an einem Projekt für eine Klasse gearbeitet, bei dem mein Code nicht die gleichen Ergebnisse wie der Referenzcode lieferte.

Ich habe meinen Code Zeile für Zeile mit dem Referenzcode verglichen, sie sahen fast genauso aus. Alles schien logisch gleichwertig zu sein. Schließlich fing ich an, Leitungen auszutauschen und zu testen, bis ich die Leitung gefunden hatte, die wichtig war.

Es stellte sich heraus, dass es so etwas war (BEARBEITEN: Der genaue Code ist weiter unten):

# my version:
max_q = max([x for x in self.getQValues(state)])

# reference version which worked:
max_q = max(x for x in self.getQValues(state))

Das hat mich verblüfft. Ich habe einige Experimente mit dem Python (2.7) -Interpreter ausprobiert und Tests mit maxListenverständnissen mit und ohne eckige Klammern durchgeführt. Die Ergebnisse schienen genau gleich zu sein.

Selbst beim Debuggen über PyCharm konnte ich keinen Grund finden, warum meine Version nicht genau das gleiche Ergebnis wie die Referenzversion lieferte. Bis zu diesem Punkt dachte ich, ich hätte einen ziemlich guten Überblick darüber, wie das Listenverständnis funktioniert (und wie die max()Funktion funktioniert), aber jetzt bin ich mir nicht so sicher, weil dies eine so seltsame Diskrepanz ist.

Was ist denn hier los? Warum liefert mein Code andere Ergebnisse als der Referenzcode (in 2.7)? Wie unterscheidet sich das Übergeben eines Verständnisses ohne Klammern vom Übergeben eines Verständnisses mit Klammern?

EDIT 2: Der genaue Code war folgender:

# works
max_q = max(self.getQValue(nextState, action) for action in legal_actions)

# doesn't work (i.e., provides different results)
max_q = max([self.getQValue(nextState, action) for action in legal_actions])

Ich denke nicht, dass dies als Duplikat markiert werden sollte - ja, die andere Frage betrifft den Unterschied zwischen Verständnisobjekten und Listenobjekten, aber nicht, warum max()unterschiedliche Ergebnisse erzielt werden würden, wenn eine "eine von X-Verständnis erstellte Liste" anstelle von " X Verständnis 'allein.

Eric:

Verlieren Sie eine lokale Variable, die sich auf den späteren Code auswirkt?

# works
action = 'something important'
max_q = max(self.getQValue(nextState, action) for action in legal_actions)
assert action == 'something important'

# doesn't work (i.e., provides different results)
max_q = max([self.getQValue(nextState, action) for action in legal_actions])
assert action == 'something important'  # fails!

Generator- und Wörterbuchverständnisse erstellen einen neuen Bereich, vor py3 jedoch keine Listenverständnisse, um die Abwärtskompatibilität zu gewährleisten

Einfache Möglichkeit zum Testen - ändern Sie Ihren Code in:

max_q = max([self.getQValue(nextState, action) for action in legal_actions])
max_q = max(self.getQValue(nextState, action) for action in legal_actions)

Angenommen, es self.getQValueist rein, dann besteht der einzige dauerhafte Nebeneffekt der ersten Zeile darin, sich mit lokalen Variablen herumzuschlagen. Wenn dies nicht funktioniert, ist dies die Ursache für Ihr Problem.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

  1. 1

    Modbus Python Schneider PM5300

  2. 2

    Wie schließe ich mehrere Ordner mit der Variablen EXTRA_ARGS aus?

  3. 3

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

  4. 4

    Elasticsearch startet nicht nach dem Laden in viele Daten

  5. 5

    ElasticSearch - Knotensperren konnten nicht abgerufen werden

  6. 6

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  7. 7

    Eclipse Oxygen - Projekte verschwinden

  8. 8

    Wie kann ich den Kaskadenmodus global einstellen?

  9. 9

    ElasticSeach Auto Complete mit dem Vervollständigungsvorschlag, um das vollständige Dokument zurückzugeben

  10. 10

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  11. 11

    Bester Crawler, um festzustellen, ob er mit Technologien gebaut wurde?

  12. 12

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  13. 13

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  14. 14

    Wie füge ich eine Spalte in einer Zeile in der Ansible Jinja2-Vorlage mit der for-Schleife hinzu?

  15. 15

    Wie Verwenden von Httpclient mit jedem SSL-Zertifikat, egal wie „schlecht“ es ist

  16. 16

    Wie kann man eine Multi-Container-Anwendung in Steuerkarten erstellen?

  17. 17

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  18. 18

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  19. 19

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  20. 20

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  21. 21

    So erstellen Sie ein langes Etikett inline mit einem Eingabefeld

heißlabel

Archiv