Python:使用 for 循环更改变量后缀



我知道这个问题被问了很多,但到目前为止我无法使用/理解答案。

我想在 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("_")检索索引号并将其用作字典键(它们可以是字符串或值(。


关于使用索引变量名称的小解释。如果你刚开始学习编程,有很多理由不使用evalexecgetattr方法。最简单的是,它效率低下,不可扩展,并且很难在脚本中的其他任何地方使用。

如果有更简单的方法可以做某事,我不是一个坚持"最佳实践"的人,但这是你想要学会避免的事情。我们编写程序以避免输入这样的东西。

如果为您提供var_2文本作为起点,那么我将使用字符串解析工具来split字符串并将其转换为值和变量名称。

通过使用字典,您可以拥有 1000 个非连续变量,只需遍历它们或分配新的关联。例如,如果您正在做一个实验,并将您的值称为tree_1tree_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)

最新更新