Python 3: Listen ändern ihre Werte nicht

Also versuche ich, eine Reihe von Listenposten durch einen zufälligen Prozentsatz mit einer for-Schleife zu ändern.

import random as rdm list = [1000, 100, 50, 25] def change(): for item in list: item = item + item*rdm.uniform(-10, 10) change() print(list) 

(Auch ich bekomme nicht, wie man mehrere Zeilen Code einfügen, so dass ich sie eins nach dem anderen, würde schätzen Hilfe mit dem auch) Und jetzt, wenn es die Liste druckt es nur besteht aus den Zahlen, die es begann mit.

  • Youtube-API: Hinzufügen von Videos zu einer Wiedergabeliste mit der neuen 32-Zeichen-Wiedergabelisten-ID
  • Lesen Sie die Werte aus dem Print-Anweisungs-Array, um ein Kreisdiagramm zu erstellen
  • Wie kann man überprüfen, ob ein Ordner Dateien mit python 3 enthält
  • Wie bekomme ich Koeffizienten Namen nach Label-Codierung und eine heiße Codierung auf scikit-lernen?
  • Index nach Wortlänge
  • Drucken einer Baumdatenstruktur in Python
  • 3 Solutions collect form web for “Python 3: Listen ändern ihre Werte nicht”

    Ihr item = …. line, wie es steht, verknüpft nur ein neues Objekt mit dem name item im namespace der function. Es gibt keinen Grund, warum diese Operation den Inhalt des Listenobjekts ändern würde, aus dem der vorherige Wert des item extrahiert wurde.

    Hier ist eine Auflistung, die eine Liste an Ort und Stelle wechselt:

     import random lyst = [1000,100,50,25] def change(lyst): for i, item in enumerate(lyst): item = item + item * random.uniform(-10, 10) lyst[i] = item print(lyst) change(lyst) print(lyst) 

    Die lyst[i] = … Zuordnung ist die Schlüssellinie, die den Inhalt der Liste tatsächlich ändert. Natürlich kannst du die beiden Zuordnungen in eine Zeile kollabieren, wenn du willst: lyst[i] = item = ….. Oder du kannst die Neuzuordnung auf den item weglassen, wenn du es nicht wieder in der Schleife benutzt lyst[i] = item + item * : lyst[i] = item + item *

    Beachten Sie, dass ich zwei kleinere Korrekturen zusätzlich durchgeführt habe: Ich habe den Variablennamen von der list zu lyst so dass er Ihren eingebauten Verweis auf die Listenklasse nicht überschattet. Ich habe auch Ihre Funktion so geändert, dass es das Listenobjekt als Argument nimmt, anstatt sich darauf zu verlassen, dass es sich um einen hartcodierten globalen Variablennamen handelt. Beide sind nur gute Praxis; Nichts mit deinem Problem zu tun.

    Schließlich ist zu bemerken, dass man das alles viel prägnanter und transparenter mit einem so genannten Listenverständnis machen kann . Wenn Sie die Liste nicht an Ort und Stelle ändern müssen, dh wenn es OK ist, mit einer geänderten Kopie der Originalliste zu enden,

     lyst = [ item + item * random.uniform(-10, 10) for item in lyst ] 

    Wenn Sie die Liste an Ort und Stelle ändern müssen (zB wenn andere Verweise auf die ursprüngliche Liste an anderer Stelle existieren und sie auch auf den aktualisierten Inhalt nach change() aufgerufen werden sollen), dann können Sie dem Vorschlag in Padraic's Kommentar folgen:

     lyst[:] = [ item + item * random.uniform(-10, 10) for item in lyst ] 

    In diesem letzten Fall können Sie sogar Speicher sparen (was nur ein Anliegen für sehr große Listen sein wird), wenn Sie die Klammerform ändern und dabei stattdessen einen Generatorausdruck verwenden:

     lyst[:] = ( item + item * random.uniform(-10, 10) for item in lyst ) 

    Sie müssen den berechneten Wert wieder in die Liste speichern.

    So ersetzen:

     for item in list: item = item + item*rdm.uniform(-10, 10) 

    Mit:

     for index, item in enumerate(list): list[index] = item + item*rdm.uniform(-10, 10); 

    Mit der modifizierten Schleife werden Sie durch jedes Element in der Liste mit seinem Index durchlaufen. Sie können nun den berechneten Wert dem jeweiligen Index in der Liste zuordnen.

    Mit funktionalen Ansatz und Listenverständnis anstelle von Schleife können Sie eine neue Liste mit den geänderten Posten erstellen (es sei denn, Sie müssen die vorhandene Liste ändern):

     import random as rdm items = [1000, 100, 50, 25] def change(items, multiply_min=-10, multiply_max=10): return [i * rdm.uniform(multiply_min, multiply_max) for i in items] items = change(items) print(items) 
    Python ist die beste Programmiersprache der Welt.