在python循环中使用iterator作为变量名

时间:2011-12-16 06:42:47

标签: python loops iterator

我一直想知道是否有办法在Python循环中使用迭代器作为变量名。例如,如果我想创建对象v0v1v2,有没有办法做这样的事情:

for i in range(3):
    v + str(i) = i**2

我知道语法错误,但这个想法应该清楚。在R中等于paste的东西?非常感谢,

5 个答案:

答案 0 :(得分:7)

内置方法globals()返回表示当前全局符号表的字典。

您可以将变量添加到globals,如下所示:

globals()["v" + str(i)] = i**2

FYI :这是您问题的答案,但肯定不是推荐的方式。直接操作globals是黑客解决方案,大多数情况下可以避免使用一些更清洁的替代方案。 (查看此主题中的其他评论

答案 1 :(得分:5)

虽然这并不试图直接回答这个问题(参见geccos对此的回答),但这通常是这种操作的“批准”方法:

v = [i**2 for i in range(3)]

print v[0] # 0
print v[1] # 1
print v[2] # 4

一般来说,使用ADT(在这种情况下是一个列表)来表示给定的问题比尝试创建“动态变量”或“变量变量”更清晰,更具可扩展性。

快乐的编码。


虽然以上使用索引,但“变量变量”的更一般形式通常使用字典来完成:

names = dict(("v" + str(i), i**2) for i in range(3))
print names["v2"] # 4

并且,对于固定的有限(和相对较小)变量集,也可以使用“解包”:

v0, v1, v2 = [i**2 for i in range(3)]
print v1 # 1

答案 2 :(得分:1)

我更喜欢xrange()到range()。 这里是你的代码:

for i in xrange(3):
    exec("v"+str(i)+" = i * i")

即使...... 你应该考虑使用一个列表

答案 3 :(得分:1)

有几种方法可以做到这一点,最好的方法取决于你在创建变量后实际想要做些什么。

globals()locals()会有效,但它们并不是您想要的。 exec()也可以使用,但比globals()locals()更糟糕。

如果v1v2v3是同质的并且您只想通过索引访问它们,那么@ user166390提到的列表理解是一个好主意。

>>> v = [i ** 2 for i in range(3)]
>>> v[0]
0
>>> v[1]
1
>>> v[2]
4

如果它总是恰好有三个要素,你也可以这样做:

>>> v1, v2, v3 = [i ** 2 for i in range(3)]
>>> v1
0
>>> v2
1
>>> v3
2

如果对象更具个性,这很好,因为你可以给它们自己的名字。

另一个中间选项是使用dict

d = {}
for i, val in enumerate(range(3)):
    d["v{}".format(i)] = val

>>> d["v0"]
0
>>> d["v1"]
1
>>> d["v2"]
4

或使用词典理解的上述快捷方式:

d = {"v{}".format(i): val for i, val in enumerate(range(3))}

答案 4 :(得分:0)

# Python 3.8.2 (default, Feb 26 2020, 02:56:10)

使用 globals() 创建变量名并使用 exec() 解包元组:

glo = globals()
listB=[]
for i in range(1,11):
    glo["v%s" % i] = i * 10
    listB.append("v%s" % i)

def print1to10():
    print("Printing v1 to v10:")
    for i in range(1,11):
        print("v%s = " % i, end="")
        print(glo["v%s" % i])

print1to10()

listA=[]
for i in range(1,11):
    listA.append(i)

listA=tuple(listA)
print(listA, '"Tuple to unpack"')

listB = str(str(listB).strip("[]").replace("'", "") + " = listA")

print(listB)

exec(listB)

print1to10()

输出:

Printing v1 to v10:
v1 = 10
v2 = 20
v3 = 30
v4 = 40
v5 = 50
v6 = 60
v7 = 70
v8 = 80
v9 = 90
v10 = 100
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) "Tuple to unpack"
v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 = listA
Printing v1 to v10:
v1 = 1
v2 = 2
v3 = 3
v4 = 4
v5 = 5
v6 = 6
v7 = 7
v8 = 8
v9 = 9
v10 = 10

请注意,可以使用 locals()、globals() 或 vars():

vList = []
for i in range(3):
    vars()["v%s" % i] = i ** 2
    vList.append(vars()["v%s"%i])

for i in range(3):
    print("v%s"%i, "=", vList[i])

输出:

v0 = 0
v1 = 1
v2 = 4

这个例子使用字典而不是列表:

vDict = {}
for i in range(3):
    vars()["v%s" % i] = i ** 2
    vDict[i] = vars()["v%s" % i]

for i in range(3):
    print("v%s"%i, "=", vDict[i])

输出:

v0 = 0
v1 = 1
v2 = 4

另请注意,无论是从字符串创建变量、分配直接值还是分配间接值,locals()、globals() 和 vars() 都可以互换使用:

vDict = {}
for i in range(1000):
    vars()["v%s" % i] = i ** 2
    vDict[i] = vars()["v%s" % i]

for i in range(0, 1000, 200):
    print("v%s"%i, "=", vDict[i])

print()
locals()[vDict[200]] = 1999  #indirect assignment
print("v200 =", vDict[200], "(direct v200 value is unchanged)") 
print()
print("v200 =", vars()[vDict[200]], "(indirect value)")
print("v200 =", locals()[vDict[200]], "(indirect value)") 
print("v200 =", globals()[vDict[200]], "(indirect value)")
print()

vars()["v%s"%200] = 2020
print("v200 =", globals()["v%s"%200], "(direct value)")
v200 = 2021
print("v200 =", locals()["v%s"%200], "(direct value)")

输出:

v0 = 0
v200 = 40000
v400 = 160000
v600 = 360000
v800 = 640000

v200 = 40000 (direct v200 value is unchanged)

v200 = 1999 (indirect value)
v200 = 1999 (indirect value)
v200 = 1999 (indirect value)

v200 = 2020 (direct value)
v200 = 2021 (direct value)

工作原理

vDict = {}
for i in range(0, 1000, 200):
    vars()["v%s" % i] = i ** 2
    vDict[i] = vars()["v%s" % i]

for i in range(0, 1000, 200):
    print("v%s"%i, "=", vDict[i])

print()
# indirect assignment using 40000 as variable (variable variable)
locals()[vDict[200]] = 1999  # using value 40000 as a variable
print("v200 =", vDict[200], "(direct v200 value is unchanged)") 
print()
print("v200 =", vars()[vDict[200]], "(indirect value from key 40000)")
print("{ '40000':", globals()[40000],"}")
print()
if vars()[vDict[200]] == globals()[40000]:
  print("They are equal!")
if globals()[vDict[200]] == locals()[40000]:
  print("They are equal!")

输出:

v0 = 0
v200 = 40000
v400 = 160000
v600 = 360000
v800 = 640000

v200 = 40000 (direct v200 value is unchanged)

v200 = 1999 (indirect value from key 40000)
{ '40000': 1999 }

They are equal!
They are equal!