我知道这个问题被问了很多,但到目前为止我无法使用/理解答案。
我想在 for 循环中更改变量的后缀。
我尝试了堆栈溢出搜索提供的所有答案。但是很难理解提问者经常提出的具体代码。
因此,为了澄清起见,我使用一个简单的例子。这并不意味着面向应用程序。我只是想了解如何更改后缀。
var_1 = 10
var_2 = 100
var_3 = 1000
for i in range(1,4):
test_i = var_i + 1
print(test_i)
预期成果: 创建和打印变量:
test_1 = 11
test_2 = 101
test_3 = 1001
预期输出
11
101
1001
错误:var_i
被读取为变量名,而不对i
进行更改。
我建议不要在99.99%的情况下使用eval
。您可以做的是使用内置的getattr
函数:
import sys
var_1 = 10
var_2 = 100
var_3 = 1000
for i in range(1,4):
test_i = getattr(sys.modules[__name__], f"var_{i}") + 1
print(test_i)
例如,与其做一个复杂的命名约定,不如尝试使用字典等数据结构来构思你的问题。
var={}
var[1] = 10
var[2] = 100
var[3] = 1000
test={}
for i in range(1,4):
test[i] = var[i] +1
print(test)
如果以某种方式为您提供var_1
等作为输入,可以使用.split("_")
检索索引号并将其用作字典键(它们可以是字符串或值(。
关于使用索引变量名称的小解释。如果你刚开始学习编程,有很多理由不使用eval
、exec
或getattr
方法。最简单的是,它效率低下,不可扩展,并且很难在脚本中的其他任何地方使用。
如果有更简单的方法可以做某事,我不是一个坚持"最佳实践"的人,但这是你想要学会避免的事情。我们编写程序以避免输入这样的东西。
如果为您提供var_2
文本作为起点,那么我将使用字符串解析工具来split
字符串并将其转换为值和变量名称。
通过使用字典,您可以拥有 1000 个非连续变量,只需遍历它们或分配新的关联。例如,如果您正在做一个实验,并将您的值称为tree_1
、tree_10
等,那么您将始终无法在代码中键入完整的变量名称,而不是简单地循环访问名为tree
的容器中的所有条目。
这与使用一堆if:else
语句来分配值有点相关:
# inefficient way -- avoid
if name == 'var_1' then:
test_1=11
elif name == 'var_2' then:
test_2=101
简单地说:
test[i]= var[i]+1
并且该行将适用于任意数量的值。
for i in range(1, 4):
print(eval('var_' + str(i)))
循序渐进:
1( 使变量成为字符串:
stringified_number = str(i)
2( 在运行时计算表达式:
evaluated_variable = eval('var_' + stringified_number)