Как вы создаете разные имена переменных в цикле? - PullRequest
94 голосов
/ 31 мая 2011

В качестве примера ...

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

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

Ответы [ 8 ]

123 голосов
/ 31 мая 2011

Конечно, вы можете;он называется словарь :

d={}
for x in range(1,10):
        d["string{0}".format(x)]="Hello"

In [7]: d["string5"]
Out[7]: 'Hello'

In [8]: d
Out[8]: 
{'string1': 'Hello',
 'string2': 'Hello',
 'string3': 'Hello',
 'string4': 'Hello',
 'string5': 'Hello',
 'string6': 'Hello',
 'string7': 'Hello',
 'string8': 'Hello',
 'string9': 'Hello'}

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

50 голосов
/ 31 мая 2011

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

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

, а затем, например:

print(string3)

даст вам:

Hello

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

11 голосов
/ 31 мая 2011

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

  • Они не нужны: вы можете хранить все в списках, словарях и т. Д.
  • Их сложно создать: вы должны использовать 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 голосов
/ 12 апреля 2017

Не используйте словарь

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 голосов
/ 07 ноября 2017

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

for k in range(5):
    exec(f'cat_{k} = k*2')

печать (cat_0)
0
печать (cat_1)
2
печать (cat_2)
4
печать (cat_3)
6
печать (cat_4)
8

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

2 голосов
/ 31 мая 2011

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

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

Таким образом, у вас было бы 9 «Привет», и вы могли бы получить их индивидуально, как это:

string[x]

Где xопределит, какой "Hello" вы хотите.

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

1 голос
/ 21 мая 2019

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

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

1 голос
/ 05 апреля 2019

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

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

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

Вот мой код:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...