在循环中如何创建不同的变量名?

209
例如,为了演示目的...
for x in range(0,9):
    string'x' = "Hello"

于是我最终得到string1、string2、string3...都等于"Hello"的字符串


43
答案是你不应该这样做。使用列表代替。 - Sven Marnach
2
如果您想在此处使用它,可以使用 x = ["Hello" * 9],然后通过 x[0]、x[1] ... 访问它。如果您想以不同的方式使用它,我认为您需要提供更多的代码背景信息。 - James Khoury
3
如果我有语言的掌控权,那么在变量名中使用数字将会导致SyntaxError: Use a data structure。;-) - Jochen Ritzel
1
不要忘记你的string0 ;) - wim
12
@James Khoury: 这不是完全正确的。这将导致 x 是一个包含单个元素的列表,即字符串 "HelloHelloHelloHelloHelloHelloHelloHelloHello"。我想你的意思是 x = ["Hello"] * 9 - user539810
显示剩余2条评论
9个回答

239
当然可以,它被称为“字典”。 (点击此处查看)
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'}

我有点玩笑地说了这句话,但真正将一个值与另一个值关联的最佳方法就是使用字典。那是字典的设计初衷!


57
这不应该被标记为正确答案,因为它不是;这是一个字典,而不是动态变量赋值,这正是提问者所询问的。 - Ghost
2
这是正确的答案,因为每当您认为需要动态变量赋值时,实际上应该使用字典。这就是我到这里来的原因; 我的代码现在因为这个答案而变得更好了。 - Herman
想象一种使用情况,我既无法反序列化也无法pickle,因为个别的列表/字典太大了,会导致我的Spark会话崩溃。 - undefined

118

这是一个真的不好的主意,但是...

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

然后举个例子:

print(string3)

将会给你:

Hello

然而这是不好的实践。 正如其他人所建议的那样,您应该使用字典或列表。除非当然你真的想知道如何做到这一点,但不想使用它。


4
你能详细说明为什么这是一个不好的主意吗? - ajdigregorio
11
@paintedcones: 首先,应该有一种方法来完成它,使用简单的字典更自然。相比之下,使用全局字典是一个不好的想法,因为它也会“隐式”地创建全局变量或修改它们。由于使用字典符号来设置和修改变量,所以没有理由使用 globals() 而不是一些简单的 dict - Tadeck
10
这个应该标记为正确答案,而不是另一个。问题是如何动态创建变量,而不是“实现类似目标的最推荐方法”。 - Ghost
如果您想定义字符串 $string1$ 至 $n$ 并使用它来定义函数内的方程式,然后在 Python 中求解它,这是否可能? - jpcgandre
你如何在循环中打印每个字符串?例如,你怎么样才能 print(string%s) - Shōgun8
显示剩余3条评论

53

你可以使用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字符串格式化功能。


15
记住 exec 会涉及黑魔法、攻击漏洞和危险行为,但它确实回答了所问的问题。 - psaxton

26

创建变量变量名是没有意义的,为什么呢?

  • 它们是不必要的:你可以把一切都存储在列表、字典等数据结构中
  • 它们难以创建:你必须使用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

谢谢!!我需要在字典或数据框列表中选择表格。由于我需要根据数据框上的某个值重新排序数据框,所以我不能使用字典形式。是的,你说得对!在某些情况下,创建变量名真的没有意义! - Doo Hyun Shin
在将多个文件读入数据框时非常有用。 - Carl Kirstein

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

这应该能够正常工作。


12

不要这样做,使用字典。

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()返回的内容不是一个好主意。


5

我会使用列表:

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") - Greg Hewgill
1
我应该知道的,谢谢你提醒我。问题已经解决了。 - Lledargo
你说得对,我想的是在字符串末尾添加内容,而不是在数组中添加。对不起,大家。 - Lledargo
严谨地说,“you would have 9 "Hello"” 应该是 “you would have 1 "Hello" 9 次”。这是重复的同一个字符串,而不是九个不同的字符串。 - Duncan

3

使用字典是保持变量和相关值的正确方式,您可以使用以下方法:

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

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

最初的回答


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接