Как создать разные имена переменных в цикле? [Дубликат]

125

Например, для целей ...

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

Итак, я получаю строку1, строку2, строку3 ... все равно "Привет".

Takkun
источник
34
Ответ в том, что вы не хотите этого делать. Вместо этого используйте список.
Sven Marnach
2
Если вы хотите использовать его именно здесь, вы можете получить x = ["Hello" * 9]к нему доступ. x[0], x[1] ...Если вы хотите использовать его по-другому, я думаю, вам придется предоставить нам еще немного фона кода.
Джеймс Хури
3
Если я когда-нибудь буду иметь власть над языком, тогда использование чисел в именах переменных даст SyntaxError: Use a data structure.;-)
Йохен Ритцель
1
и не забудьте свою строку0;)
wim
10
@ Джеймс Хури: Это не совсем так. В результате xполучился бы список, содержащий единственный элемент - строку «HelloHelloHelloHelloHelloHelloHelloHelloHello». Я думаю, вы имели в виду x = ["Hello"] * 9.

Ответы:

163

Что вы можете; это называется словарем :

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

Я сказал это несколько условно, но на самом деле лучший способ связать одно значение с другим значением - это словарь. Вот для чего он был создан!

волк
источник
62

Это действительно плохая идея, но ...

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

а потом например:

print(string3)

дам тебе:

Hello

Однако это плохая практика. Вместо этого вы должны использовать словари или списки, как предлагают другие. Если, конечно, вы действительно не хотели знать, как это сделать, но не хотели этим пользоваться.

Tadeck
источник
2
Вы можете объяснить, почему это плохая идея?
ajdigregorio 08
6
@paintedcones: Во-первых, это должен быть один способ , и использование простых словарей более естественно. Использование вместо этого словаря глобальных переменных - плохая идея, потому что он также «неявно» создает или изменяет глобальные переменные. Поскольку и установка, и изменение переменных таким образом требует словарной нотации, нет никаких причин использовать globals()вместо некоторых простых dict.
Tadeck
Есть несколько ситуаций, когда вам действительно нужно создать кучу переменных, x1, x2, x3 и т. Д. Но в большинстве ситуаций использование словаря действительно является наиболее подходящим делом.
DevilApple227 02
20

Один из способов сделать это - использовать exec(). Например:

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

Здесь я использую удобное форматирование строки f в Python 3.6+.

Коллин В.
источник
5
Вспомните execчто-нибудь, черную магию, уязвимости атак, плохие вещи, но это действительно отвечает на вопрос, как задано.
psaxton 06
18

Создавать переменные имена переменных просто бессмысленно. Зачем?

  • В них нет необходимости: все можно хранить в списках, словарях и т. Д.
  • Их сложно создать: нужно использовать execилиglobals()
  • Вы не можете их использовать: как написать код, использующий эти переменные? Вы должны exec/globals()снова использовать

Использовать список намного проще:

# 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
Йохен Ритцель
источник
Спасибо!! Мне нужно было выбрать форму из словаря или списка фреймов данных. И поскольку мне нужно было переупорядочить фрейм данных на основе определенного значения в фрейме данных, я не мог использовать словарную форму. Да, ты прав! В некоторых случаях создавать имена переменных действительно бессмысленно!
Ду Хён Шин
9

Не делайте этого, используйте словарь

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

не делай этого, используй диктат

globals () имеет риск, поскольку он дает вам то, на что в настоящее время указывает пространство имен, но это может измениться, поэтому изменение возврата из globals () не является хорошей идеей

Аарон Гольдман
источник
8
for x in range(9):
    exec("string" + str(x) + " = 'hello'")

Это должно сработать.

Абхишек Рай
источник
3

Я бы использовал список:

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

Таким образом, у вас будет 9 "Hello", и вы можете получить их по отдельности следующим образом:

string[x]

Где xбы определить, какой «привет» вы хотите.

Итак, print(string[1])напечатал бы Hello.

Lledargo
источник
1
В отличие от некоторых языков, вы не можете назначать элементы в списке Python, которые еще не существуют (вы получите ошибку «индекс назначения списка вне диапазона»). Вы можете использовать string.append("Hello")вместо этого.
Грег Хьюгилл
1
Я должен был знать это, спасибо, что напомнили мне. Это исправлено.
Lledargo
Правильно, я думал добавить в конец строки, а не в массив. Мои извинения всем.
Lledargo
Педантично «у вас будет 9« Hello », должно быть« у вас будет 1 «Hello» 9 раз ». Повторяется одна и та же строка, а не девять разностных строк.
Дункан
2

Я думаю, что проблема здесь не в том, чтобы вызывать global ()

Я бы лично определил список для ваших (динамических) переменных, которые будут храниться, а затем добавить к нему в цикле for. Затем используйте отдельный цикл for для просмотра каждой записи или даже для выполнения других операций.

Вот пример - у меня есть несколько сетевых коммутаторов (скажем, от 2 до 8) в разных ветвях. Теперь мне нужно убедиться, что у меня есть способ определить, сколько коммутаторов доступно (или работает - тест ping) в любой данной ветке, а затем выполнить с ними некоторые операции.

Вот мой код:

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

Выход:

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07

Кумар Чан
источник
2

Использование словарей должно быть правильным способом сохранить переменные и связанные с ними значения, и вы можете использовать это:

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

Но если вы хотите добавить переменные к локальным переменным, вы можете использовать:

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

И, например, если вы хотите присвоить им значения от 0 до 8, вы можете использовать:

for i in range(9):
     exec('string%s = %s' % (i,i))
Ашкан Мирзаи
источник
0

Словарь может содержать значения, а значения могут быть добавлены с помощью метода update (). Вы хотите, чтобы ваша система создавала переменные, поэтому вы должны знать, где их хранить.

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
Ogibalboa
источник