Ответ в том, что вы не хотите этого делать. Вместо этого используйте список.
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.
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'}
Я сказал это несколько условно, но на самом деле лучший способ связать одно значение с другим значением - это словарь. Вот для чего он был создан!
for x in range(0,9):
globals()['string%s'% x]='Hello'
а потом например:
print(string3)
дам тебе:
Hello
Однако это плохая практика. Вместо этого вы должны использовать словари или списки, как предлагают другие. Если, конечно, вы действительно не хотели знать, как это сделать, но не хотели этим пользоваться.
@paintedcones: Во-первых, это должен быть один способ , и использование простых словарей более естественно. Использование вместо этого словаря глобальных переменных - плохая идея, потому что он также «неявно» создает или изменяет глобальные переменные. Поскольку и установка, и изменение переменных таким образом требует словарной нотации, нет никаких причин использовать globals()вместо некоторых простых dict.
Tadeck
Есть несколько ситуаций, когда вам действительно нужно создать кучу переменных, x1, x2, x3 и т. Д. Но в большинстве ситуаций использование словаря действительно является наиболее подходящим делом.
DevilApple227 02
20
Один из способов сделать это - использовать exec(). Например:
Вспомните 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 themprint string
print string[6]# or pick any of them
Спасибо!! Мне нужно было выбрать форму из словаря или списка фреймов данных. И поскольку мне нужно было переупорядочить фрейм данных на основе определенного значения в фрейме данных, я не мог использовать словарную форму. Да, ты прав! В некоторых случаях создавать имена переменных действительно бессмысленно!
Ду Хён Шин
9
Не делайте этого, используйте словарь
import sys
this = sys.modules[__name__]# this is now your current namespacefor 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 () не является хорошей идеей
В отличие от некоторых языков, вы не можете назначать элементы в списке 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 sfor 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 onfor 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()
Словарь может содержать значения, а значения могут быть добавлены с помощью метода 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.whileTrue:
value =10#value to assign
variables.update({name:value})if break_condition ==True:break
x = ["Hello" * 9]
к нему доступ.x[0], x[1] ...
Если вы хотите использовать его по-другому, я думаю, вам придется предоставить нам еще немного фона кода.SyntaxError: Use a data structure.
;-)x
получился бы список, содержащий единственный элемент - строку «HelloHelloHelloHelloHelloHelloHelloHelloHello». Я думаю, вы имели в видуx = ["Hello"] * 9
.Ответы:
Что вы можете; это называется словарем :
Я сказал это несколько условно, но на самом деле лучший способ связать одно значение с другим значением - это словарь. Вот для чего он был создан!
источник
Это действительно плохая идея, но ...
а потом например:
дам тебе:
Однако это плохая практика. Вместо этого вы должны использовать словари или списки, как предлагают другие. Если, конечно, вы действительно не хотели знать, как это сделать, но не хотели этим пользоваться.
источник
globals()
вместо некоторых простыхdict
.Один из способов сделать это - использовать
exec()
. Например:Здесь я использую удобное форматирование строки f в Python 3.6+.
источник
exec
что-нибудь, черную магию, уязвимости атак, плохие вещи, но это действительно отвечает на вопрос, как задано.Создавать переменные имена переменных просто бессмысленно. Зачем?
exec
илиglobals()
exec/globals()
снова использоватьИспользовать список намного проще:
источник
Не делайте этого, используйте словарь
не делай этого, используй диктат
globals () имеет риск, поскольку он дает вам то, на что в настоящее время указывает пространство имен, но это может измениться, поэтому изменение возврата из globals () не является хорошей идеей
источник
Это должно сработать.
источник
Я бы использовал список:
Таким образом, у вас будет 9 "Hello", и вы можете получить их по отдельности следующим образом:
Где
x
бы определить, какой «привет» вы хотите.Итак,
print(string[1])
напечатал быHello
.источник
string.append("Hello")
вместо этого.Я думаю, что проблема здесь не в том, чтобы вызывать global ()
Я бы лично определил список для ваших (динамических) переменных, которые будут храниться, а затем добавить к нему в цикле for. Затем используйте отдельный цикл for для просмотра каждой записи или даже для выполнения других операций.
Вот пример - у меня есть несколько сетевых коммутаторов (скажем, от 2 до 8) в разных ветвях. Теперь мне нужно убедиться, что у меня есть способ определить, сколько коммутаторов доступно (или работает - тест ping) в любой данной ветке, а затем выполнить с ними некоторые операции.
Вот мой код:
Выход:
BR123SW01
BR123SW02
BR123SW03
BR123SW04
BR123SW05
BR123SW06
BR123SW07
источник
Использование словарей должно быть правильным способом сохранить переменные и связанные с ними значения, и вы можете использовать это:
Но если вы хотите добавить переменные к локальным переменным, вы можете использовать:
И, например, если вы хотите присвоить им значения от 0 до 8, вы можете использовать:
источник
Словарь может содержать значения, а значения могут быть добавлены с помощью метода update (). Вы хотите, чтобы ваша система создавала переменные, поэтому вы должны знать, где их хранить.
источник