Wie erstellen Sie verschiedene Variablennamen in einer Schleife? [Duplikat]


124

Zum Beispiel ...

for x in range(0,9):
    string'x' = "Hello"

Am Ende habe ich string1, string2, string3 ... alle gleich "Hallo"


34
Die Antwort ist, dass Sie dies nicht tun möchten. Verwenden Sie stattdessen eine Liste.
Sven Marnach

2
Wenn Sie es hier verwenden möchten, können Sie x = ["Hello" * 9]darauf zugreifen. x[0], x[1] ...Wenn Sie es auf eine andere Weise verwenden möchten, müssen Sie uns meiner Meinung nach mehr Code-Hintergrund geben.
James Khoury

3
Wenn ich jemals Macht über eine Sprache habe, gibt die Verwendung von Zahlen in Variablennamen SyntaxError: Use a data structure.;-)
Jochen Ritzel

1
und vergiss deine string0 nicht;)
wim

10
@ James Khoury: Das ist nicht ganz richtig. Das würde xzu einer Liste führen, die ein einzelnes Element enthält - die Zeichenfolge "HelloHelloHelloHelloHelloHelloHelloHelloHello". Ich denke du meintest x = ["Hello"] * 9.

Antworten:


161

Sicher kannst du; es heißt ein Wörterbuch :

d = {}
for x in range(1, 10):
    d["string{0}".format(x)] = "Hello"
>>> d["string5"]
'Hello'
>>> d
{'string1': 'Hello',
 'string2': 'Hello',
 'string3': 'Hello',
 'string4': 'Hello',
 'string5': 'Hello',
 'string6': 'Hello',
 'string7': 'Hello',
 'string8': 'Hello',
 'string9': 'Hello'}

Ich sagte dies etwas in Schach, aber der beste Weg, einen Wert mit einem anderen Wert zu verknüpfen, ist ein Wörterbuch. Dafür wurde es entwickelt!


62

Es ist wirklich eine schlechte Idee, aber ...

for x in range(0, 9):
    globals()['string%s' % x] = 'Hello'

und dann zum Beispiel:

print(string3)

werde dir geben:

Hello

Dies ist jedoch eine schlechte Praxis. Sie sollten stattdessen Wörterbücher oder Listen verwenden, wie andere vorschlagen. Es sei denn natürlich, Sie wollten wirklich wissen, wie es geht, wollten es aber nicht verwenden.


2
Können Sie erläutern, warum dies eine schlechte Idee ist?
Ajdigregorio

6
@paintedcones: Erstens sollte es einen Weg geben, dies zu tun , und die Verwendung einfacher Wörterbücher ist natürlicher. Die Verwendung des globalen Wörterbuchs ist eine schlechte Idee, da es auch "implizit" globale Variablen erstellt oder diese ändert. Da sowohl das Setzen als auch das Ändern von Variablen auf diese Weise eine Wörterbuchnotation erfordert, gibt es keinen Grund, globals()anstelle einer einfachen zu verwenden dict.
Tadeck

Es gibt einige Situationen, in denen Sie eine Reihe von Variablen erstellen müssen, x1, x2, x3 usw. In den meisten Situationen ist die Verwendung eines Wörterbuchs jedoch am besten geeignet.
DevilApple227

20

Eine Möglichkeit, dies zu tun, ist mit exec(). Beispielsweise:

for k in range(5):
    exec(f'cat_{k} = k*2')
>>> print(cat_0)
0
>>> print(cat_1)
2
>>> print(cat_2)
4
>>> print(cat_3)
6
>>> print(cat_4)
8

Hier nutze ich die praktische Formatierung von F-Strings in Python 3.6+


4
Erinnern Sie sich an execetwas, schwarze Magie, Angriffslücken, schlechtes Zeug, aber es beantwortet die gestellte Frage.
Psaxton

18

Es ist einfach sinnlos, variable Variablennamen zu erstellen. Warum?

  • Sie sind nicht erforderlich: Sie können alles in Listen, Wörterbüchern usw. speichern
  • Sie sind schwer zu erstellen: Sie müssen execoder verwendenglobals()
  • Sie können sie nicht verwenden: Wie schreiben Sie Code, der diese Variablen verwendet? Sie müssen exec/globals()erneut verwenden

Die Verwendung einer Liste ist viel einfacher:

# 8 strings: `Hello String 0, .. ,Hello String 8`
strings = ["Hello String %d" % x for x in range(9)]
for string in strings: # you can loop over them
    print string
print string[6] # or pick any of them

Danke dir!! Ich musste das Formular aus dem Wörterbuch oder der Liste der Datenrahmen auswählen. Und da ich den Datenrahmen basierend auf einem bestimmten Wert im Datenrahmen neu anordnen musste, hätte ich kein Wörterbuchformular verwenden können. Ja, du hast recht! In einigen Fällen ist es wirklich sinnlos, Variablennamen zu erstellen!
Doo Hyun Shin

9

Verwenden Sie dazu kein Wörterbuch

import sys
this = sys.modules[__name__] # this is now your current namespace
for x in range(0,9):
    setattr(this, 'string%s' % x, 'Hello')

print string0
print string1
print string2
print string3
print string4
print string5
print string6
print string7
print string8

Verwenden Sie dazu kein Diktat

globals () birgt ein Risiko, da es Ihnen angibt, auf was der Namespace derzeit zeigt. Dies kann sich jedoch ändern. Daher ist es keine gute Idee, die Rückgabe von globals () zu ändern


8
for x in range(9):
    exec("string" + str(x) + " = 'hello'")

Das sollte funktionieren.


3

Ich würde eine Liste verwenden:

string = []
for i in range(0, 9):
  string.append("Hello")

Auf diese Weise hätten Sie 9 "Hallo" und Sie könnten sie einzeln wie folgt erhalten:

string[x]

Wo xwürde identifizieren, welches "Hallo" Sie wollen.

Also print(string[1])würde drucken Hello.


1
Im Gegensatz zu einigen Sprachen können Sie Elementen in einer Python-Liste, die noch nicht vorhanden sind, keine Elemente zuweisen (es wird der Fehler "Listenzuweisungsindex außerhalb des Bereichs" angezeigt). Möglicherweise möchten Sie string.append("Hello")stattdessen verwenden.
Greg Hewgill

1
Ich hätte das wissen müssen, danke, dass du mich daran erinnert hast. Es ist repariert.
Lledargo

Ihr Recht, ich habe darüber nachgedacht, am Ende eines Strings etwas hinzuzufügen, nicht zu einem Array. Ich entschuldige mich bei allen.
Lledargo

Pedantisch "Sie hätten 9" Hallo "" sollte "Sie würden 9 Mal" Hallo "haben". Es ist dieselbe Saite, die wiederholt wird, nicht neun verschiedene Saiten.
Duncan

2

Ich denke, die Herausforderung besteht hier nicht darin, global () aufzurufen.

Ich würde persönlich eine Liste für Ihre (dynamischen) Variablen definieren, die gehalten werden soll, und sie dann innerhalb einer for-Schleife anhängen. Verwenden Sie dann eine separate for-Schleife, um jeden Eintrag anzuzeigen oder sogar andere Operationen auszuführen.

Hier ein Beispiel: Ich habe eine Reihe von Netzwerk-Switches (z. B. zwischen 2 und 8) in verschiedenen Branchen. Jetzt muss ich sicherstellen, dass ich feststellen kann, wie viele Switches in einem bestimmten Zweig verfügbar sind (oder ob ein Test durchgeführt wird), und dann einige Operationen an ihnen ausführen.

Hier ist mein Code:

import requests
import sys

def switch_name(branchNum):
    # s is an empty list to start with
    s = []
    #this FOR loop is purely for creating and storing the dynamic variable names in s
    for x in range(1,8,+1):
        s.append("BR" + str(branchNum) + "SW0" + str(x))

    #this FOR loop is used to read each of the switch in list s and perform operations on
    for i in s:
        print(i,"\n")
        # other operations can be executed here too for each switch (i) - like SSH in using paramiko and changing switch interface VLAN etc.


def main():  

    # for example's sake - hard coding the site code
    branchNum= "123"
    switch_name(branchNum)


if __name__ == '__main__':
    main()

Ausgabe ist:

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07


2

Die Verwendung von Wörterbüchern sollte der richtige Weg sein, um die Variablen und zugehörigen Werte beizubehalten. Sie können Folgendes verwenden:

dict_ = {}
for i in range(9):
     dict_['string%s' % i]  = 'Hello'

Wenn Sie die Variablen jedoch zu den lokalen Variablen hinzufügen möchten, können Sie Folgendes verwenden:

for i in range(9):
     exec('string%s = Hello' % i)

Wenn Sie ihnen beispielsweise die Werte 0 bis 8 zuweisen möchten, können Sie Folgendes verwenden:

for i in range(9):
     exec('string%s = %s' % (i,i))

0

Das Wörterbuch kann Werte enthalten und Werte können mithilfe der update () -Methode hinzugefügt werden. Sie möchten, dass Ihr System Variablen erstellt, daher sollten Sie wissen, wo Sie diese aufbewahren müssen.

variables = {}
break_condition= True # Dont forget to add break condition to while loop if you dont want your system to go crazy.
name = variable
i = 0 
name = name + str(i) #this will be your variable name.
while True:
    value = 10 #value to assign
    variables.update(
                  {name:value})
    if break_condition == True:
        break
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.