在循环中如何创建不同的变量名?[重复]


124

出于示例目的...

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

所以我最终得到了string1,string2,string3 ...都等于“ Hello”


34
答案是您不想这样做。请改用列表。
Sven Marnach

2
如果您要在此处使用它,则可以x = ["Hello" * 9]通过以下方式访问它:x[0], x[1] ...如果您想以其他方式使用它,我想您必须给我们更多的代码背景。
James Khoury

3
如果我曾经掌握过某种语言,那么在变量名中使用数字会SyntaxError: Use a data structure.
得出

1
并且不要忘记您的string0;)
2011年

10
@James Khoury:不太正确。最终将x得到一个包含单个元素的列表-字符串“ HelloHelloHelloHelloHelloHelloHelloHelloHelloHello”。我想你的意思是x = ["Hello"] * 9

Answers:


161

你当然可以; 它被称为字典

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

但是,这是不好的做法。如其他人建议的那样,您应该改用字典或列表。当然,除非您真的想知道如何做,但不想使用它。


2
您能否详细说明为什么这是一个坏主意?
ajdigregorio 2014年

6
@paintedcones:首先,应该有一种方法可以做到这一点,并且使用简单的字典更为自然。而是使用globals字典是一个坏主意,因为它还会“隐式”创建或修改全局变量。由于以这种方式设置和修改变量都需要字典符号,因此没有必要使用globals()而不是简单的dict
塔德克

在某些情况下,确实需要创建一堆变量x1,x2,x3等。但是在大多数情况下,使用字典确实是最合适的方法。
DevilApple227

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

在这里,我利用了Python 3.6+中方便的f字符串格式


4
记住exec一些东西,黑魔法,攻击漏洞,坏东西,但确实可以回答所问的问题。
psaxton

18

创建变量变量名根本没有意义。为什么?

  • 它们是不必要的:您可以将所有内容存储在列表,字典等中
  • 它们很难创建:您必须使用execglobals()
  • 您不能使用它们:如何编写使用这些变量的代码?您必须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()的返回值不是一个好主意



3

我会使用一个列表:

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

这样,您将拥有9个“ Hello”,并且可以像这样单独获取它们:

string[x]

哪里 x可以找到您想要的“ Hello”。

因此,print(string[1])将打印Hello


1
与某些语言不同,您无法为Python列表中尚不存在的元素分配(您将收到“列表分配索引超出范围”错误)。您可能要使用string.append("Hello")
2011年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.