Come si creano diversi nomi di variabili durante un ciclo? [duplicare]


125

A scopo esemplificativo ...

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

Quindi finisco con string1, string2, string3 ... tutte uguali a "Hello"


34
La risposta è che non vuoi farlo. Usa invece un elenco.
Sven Marnach

2
Se è qui che vuoi usarlo puoi averlo x = ["Hello" * 9]quindi accedervi da x[0], x[1] ...Se vuoi usarlo in un modo diverso penso che dovrai fornirci un po 'di codice in più.
James Khoury

3
Se mai avrò potere su una lingua, l'uso di numeri nei nomi delle variabili darà SyntaxError: Use a data structure.;-)
Jochen Ritzel

1
e non dimenticare la stringa0;)
wim

10
@ James Khoury: Non è del tutto corretto. Ciò finirebbe per xessere un elenco contenente un singolo elemento: la stringa "HelloHelloHelloHelloHelloHelloHelloHelloHello". Penso che intendevi x = ["Hello"] * 9.

Risposte:


162

Certo che puoi; si chiama dizionario :

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'}

L'ho detto un po 'con la lingua sotto controllo, ma davvero il modo migliore per associare un valore a un altro è un dizionario. Questo è ciò per cui è stato progettato!


62

È davvero una cattiva idea, ma ...

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

e poi ad esempio:

print(string3)

ti darà:

Hello

Tuttavia questa è una cattiva pratica. Dovresti invece usare dizionari o elenchi, come altri propongono. A meno che, ovviamente, tu non volessi davvero sapere come farlo, ma non volessi usarlo.


2
Puoi spiegare perché questa è una cattiva idea?
ajdigregorio

6
@paintedcones: Innanzitutto, dovrebbe esserci un modo per farlo e l'uso di dizionari semplici è più naturale. Usare invece il dizionario globale è una cattiva idea, perché anche "implicitamente" crea variabili globali o le modifica. Poiché sia ​​l'impostazione che la modifica delle variabili in questo modo richiedono la notazione del dizionario, non c'è motivo di usarle globals()invece di alcune semplici dict.
Tadeck

Ci sono alcune situazioni in cui è necessario creare un mucchio di variabili, x1, x2, x3, ecc. Ma nella maggior parte delle situazioni, usare un dizionario è davvero la cosa più appropriata da fare.
DevilApple227

20

Un modo per farlo è con exec(). Per esempio:

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

Qui sto sfruttando la pratica formattazione della stringa f in Python 3.6+


5
Ricorda execqualcosa, qualcosa, magia nera, vulnerabilità di attacco, cose brutte, ma risponde alla domanda come chiesto.
psaxton

18

È semplicemente inutile creare nomi di variabili variabili. Perché?

  • Non sono necessari: puoi memorizzare tutto in elenchi, dizionari e così via
  • Sono difficili da creare: devi usare execoglobals()
  • Non puoi usarli: come scrivi codice che utilizza queste variabili? Devi usare di exec/globals()nuovo

Usare un elenco è molto più semplice:

# 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

Grazie!! Avevo bisogno di scegliere il modulo tra dizionario o elenco di dataframe. E poiché avevo bisogno di riordinare il dataframe in base a un certo valore sul dataframe, non avrei potuto usare il modulo del dizionario. Si hai ragione! In alcuni casi è davvero inutile creare nomi di variabili!
Doo Hyun Shin

9

Non farlo usa un dizionario

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

non farlo usa un dict

globals () ha dei rischi in quanto ti dà ciò a cui punta lo spazio dei nomi ma questo può cambiare e quindi modificare il ritorno da globals () non è una buona idea


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

Questo dovrebbe funzionare.


3

Userei un elenco:

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

In questo modo, avresti 9 "Hello" e potresti ottenerli individualmente in questo modo:

string[x]

Dove xidentificherebbe quale "Ciao" vuoi.

Quindi, print(string[1])stamperebbe Hello.


1
A differenza di alcuni linguaggi, non puoi assegnare a elementi in un elenco Python che non esistono ancora (otterrai un errore "indice di assegnazione elenco fuori intervallo"). Potresti voler usare string.append("Hello")invece.
Greg Hewgill

1
Avrei dovuto saperlo, grazie per avermelo ricordato. È risolto.
Lledargo

Hai ragione, stavo pensando di aggiungere alla fine di una stringa, non di aggiungere a un array. Mi scuso a tutti.
Lledargo

Pedanticamente "avresti 9" Hello "" dovrebbe essere "avresti 1" Hello "9 volte". È la stessa stringa ripetuta, non nove stringhe di differenza.
Duncan

2

Penso che la sfida qui non sia invocare global ()

Definirei personalmente un elenco per le vostre variabili (dinamiche) da tenere e poi vi aggiungerei all'interno di un ciclo for. Quindi utilizzare un ciclo for separato per visualizzare ogni voce o anche eseguire altre operazioni.

Ecco un esempio: ho un numero di switch di rete (diciamo tra 2 e 8) in vari BRanches. Ora devo assicurarmi di avere un modo per determinare quanti switch sono disponibili (o test di live ping) in un dato ramo e quindi eseguire alcune operazioni su di essi.

Ecco il mio codice:

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()

L'output è:

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07


2

L'uso dei dizionari dovrebbe essere il modo giusto per mantenere le variabili e i valori associati, e puoi usare questo:

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

Ma se vuoi aggiungere le variabili alle variabili locali puoi usare:

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

E ad esempio se vuoi assegnare loro valori da 0 a 8, puoi usare:

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

0

Il dizionario può contenere valori e i valori possono essere aggiunti utilizzando il metodo update (). Vuoi che il tuo sistema crei variabili, quindi dovresti sapere dove tenerle.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.