我一直想知道是否有办法在Python循环中使用迭代器作为变量名。例如,如果我想创建对象v0
,v1
,v2
,有没有办法做这样的事情:
for i in range(3):
v + str(i) = i**2
我知道语法错误,但这个想法应该清楚。在R中等于paste
的东西?非常感谢,
答案 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()
更糟糕。
如果v1
,v2
和v3
是同质的并且您只想通过索引访问它们,那么@ 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)
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
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
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!