Wie führe ich Variablenvariablen in Python durch?
Hier ist ein ausführlicher manueller Eintrag, zum Beispiel: Variable Variablen
Ich habe gehört, dass dies im Allgemeinen eine schlechte Idee ist, und es ist eine Sicherheitslücke in Python. Ist das wahr?
python
variable-variables
Taryn
quelle
quelle
Antworten:
Sie können Wörterbücher verwenden , um dies zu erreichen. Wörterbücher sind Speicher von Schlüsseln und Werten.
Sie können Variablenschlüsselnamen verwenden, um die Wirkung variabler Variablen ohne Sicherheitsrisiko zu erzielen.
Für Fälle, in denen Sie daran denken, so etwas zu tun
Eine Liste ist möglicherweise angemessener als ein Diktat. Eine Liste repräsentiert eine geordnete Folge von Objekten mit ganzzahligen Indizes:
Für geordnete Sequenzen, sind Listen bequemer als dicts mit Integer - Schlüssel, weil Listen Iteration in Indexreihenfolge unterstützen, Slicing ,
append
und anderen Operationen , die umständlich Schlüssel - Management mit einem dict erfordern würden.quelle
Verwenden Sie die integrierte
getattr
Funktion, um ein Attribut für ein Objekt nach Namen abzurufen. Ändern Sie den Namen nach Bedarf.quelle
Das ist keine gute Idee. Wenn Sie auf eine globale Variable zugreifen, können Sie diese verwenden
globals()
.Wenn Sie auf eine Variable im lokalen Bereich zugreifen möchten, können Sie sie verwenden
locals()
, dem zurückgegebenen Diktat jedoch keine Werte zuweisen.Eine bessere Lösung besteht darin
getattr
, Ihre Variablen in einem Wörterbuch zu verwenden oder zu speichern und dann über den Namen darauf zuzugreifen.quelle
x = "foo"
undlocals()["x"] = "bar"
Verwendenprint x
gibt die Ausgabebar
für Jython 2.5.2. Dies wurde mit einem On-Demand-Automatisierungsskript in maximo getestet .Wann immer Sie variable Variablen verwenden möchten, ist es wahrscheinlich besser, ein Wörterbuch zu verwenden. Also anstatt zu schreiben
du schreibst
Auf diese Weise überschreiben Sie nicht versehentlich zuvor vorhandene Variablen (was der Sicherheitsaspekt ist) und können verschiedene "Namespaces" haben.
quelle
Neue Codierer schreiben manchmal Code wie folgt:
Dem Codierer bleibt dann ein Stapel benannter Variablen mit einem Codierungsaufwand von O ( m * n ) übrig , wobei m die Anzahl der benannten Variablen und n die Häufigkeit ist, mit der auf diese Gruppe von Variablen zugegriffen werden muss (einschließlich der Erstellung) ). Der klügere Anfänger stellt fest, dass der einzige Unterschied in jeder dieser Zeilen eine Zahl ist, die sich aufgrund einer Regel ändert, und entscheidet sich für die Verwendung einer Schleife. Sie bleiben jedoch bei der dynamischen Erstellung dieser Variablennamen hängen und versuchen möglicherweise Folgendes:
Sie stellen bald fest, dass dies nicht funktioniert.
Wenn das Programm beliebige Variablennamen benötigt, ist ein Wörterbuch die beste Wahl, wie in anderen Antworten erläutert. Wenn Sie jedoch einfach versuchen, viele Variablen zu erstellen, und es Ihnen nichts ausmacht, mit einer Folge von Ganzzahlen auf sie zu verweisen, suchen Sie wahrscheinlich nach einer
list
. Dies gilt insbesondere dann, wenn Ihre Daten homogen sind, z. B. tägliche Temperaturwerte, wöchentliche Quizergebnisse oder ein Raster grafischer Widgets.Dies kann wie folgt zusammengesetzt werden:
Dies
list
kann auch in einer Zeile mit einem Verständnis erstellt werden:In beiden Fällen ist das Ergebnis ein ausgefülltes Ergebnis
list
, bei dem auf das erste Element zugegriffen wirdmy_calculator.buttons[0]
, auf das nächste mitmy_calculator.buttons[1]
und so weiter. Der Name der "Basis" -Variable wird zum Namen derlist
und der variierende Bezeichner wird verwendet, um darauf zuzugreifen.Vergessen Sie nicht andere Datenstrukturen wie die
set
- dies ähnelt einem Wörterbuch, außer dass jedem "Namen" kein Wert zugeordnet ist. Wenn Sie einfach eine "Tasche" mit Objekten benötigen, kann dies eine gute Wahl sein. Anstelle von so etwas:Sie werden dies haben:
Verwenden Sie a
list
für eine Folge ähnlicher Objekte, aset
für einen beliebig geordneten Beutel mit Objekten oder adict
für einen Beutel mit Namen mit zugehörigen Werten.quelle
Anstelle eines Wörterbuchs können Sie auch
namedtuple
das Sammlungsmodul verwenden, um den Zugriff zu erleichtern.Zum Beispiel:
quelle
Wenn Sie kein Objekt verwenden möchten, können Sie es dennoch
setattr()
in Ihrem aktuellen Modul verwenden:quelle
__dict__
Variablen. Ich frage mich, ob es einen allgemeinen Mechanismus gibt, um eine globale Variable dynamisch zu erstellen .globals()
kann dies tunDie
SimpleNamespace
Klasse kann verwendet werden, um neue Attribute mitsetattr
oder eine Unterklasse zuSimpleNamespace
erstellen und eine eigene Funktion zum Hinzufügen neuer Attributnamen (Variablen) zu erstellen.quelle
Ich beantworte die Frage: Wie erhalte ich den Wert einer Variablen, deren Name in einer Zeichenfolge angegeben ist? Dies wird als Duplikat mit einem Link zu dieser Frage geschlossen.
Wenn die Variablen in Frage Teil eines Objekts (Teil einer Klasse zum Beispiel) sind dann einige nützliche Funktionen genau zu erreichen , die sind
hasattr
,getattr
undsetattr
.So können Sie zum Beispiel haben:
Dann können Sie tun:
quelle
Verwenden
globals()
Sie können Variablen tatsächlich dynamisch dem globalen Bereich zuweisen, wenn Sie beispielsweise 10 Variablen möchten, auf die in einem globalen Bereich zugegriffen werden kann
i_1
,i_2
...i_10
:Dadurch wird all diesen 10 Variablen ein 'a' zugewiesen. Natürlich können Sie den Wert auch dynamisch ändern. Auf alle diese Variablen kann jetzt wie auf andere global deklarierte Variablen zugegriffen werden:
quelle
Sie müssen eine
globals()
integrierte Methode verwenden , um dieses Verhalten zu erreichen:quelle
Der Konsens besteht darin, dafür ein Wörterbuch zu verwenden - siehe die anderen Antworten. Dies ist in den meisten Fällen eine gute Idee, daraus ergeben sich jedoch viele Aspekte:
Trotzdem habe ich eine Manager- Klasse für variable Variablen implementiert, die einige der oben genannten Ideen enthält. Es funktioniert für Python 2 und 3.
Sie würden die Klasse folgendermaßen verwenden :
Wenn Sie nur das Überschreiben von Variablen desselben Typs zulassen möchten:
quelle
Ich habe beide in Python 3.7.3 ausprobiert. Sie können entweder globals () oder vars () verwenden.
Referenz:
https://www.daniweb.com/programming/software-development/threads/111526/setting-a-string-as-a-variable-name#post548936
quelle
Jeder Satz von Variablen kann auch in eine Klasse eingeschlossen werden. "Variablen" -Variablen können zur Laufzeit zur Klasseninstanz hinzugefügt werden, indem über das Attribut __dict__ direkt auf das integrierte Wörterbuch zugegriffen wird.
Der folgende Code definiert die Variables-Klasse, die ihrer Instanz während der Konstruktion Variablen (in diesem Fall Attribute) hinzufügt. Variablennamen stammen aus einer angegebenen Liste (die beispielsweise durch Programmcode generiert worden sein könnte):
quelle