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

Python:使用for循环更改变量后缀,python,for-loop,variable-names,Python,For Loop,Variable Names,我知道有人问了我很多问题,但到目前为止,我无法理解答案 我想更改for循环中变量的后缀 我尝试了stackoverflow搜索提供的所有答案。但很难理解提问者经常呈现的特定代码 为了澄清,我用了一个简单的例子。这并不意味着面向应用程序。我只是想了解如何更改后缀 var_1=10 var_2=100 var_3=1000 对于范围(1,4)内的i: 测试i=变量i+1 打印(测试i) 预期结果: 创建和打印变量: test_1 = 11 test_2 = 101 test_3 = 1001

我知道有人问了我很多问题,但到目前为止,我无法理解答案

我想更改for循环中变量的后缀

我尝试了stackoverflow搜索提供的所有答案。但很难理解提问者经常呈现的特定代码

为了澄清,我用了一个简单的例子。这并不意味着面向应用程序。我只是想了解如何更改后缀

var_1=10
var_2=100
var_3=1000
对于范围(1,4)内的i:
测试i=变量i+1
打印(测试i)
预期结果: 创建和打印变量:

test_1 = 11 
test_2 = 101 
test_3 = 1001

预期产出

11
101
1001

错误:
var_i
被读取为变量名,而不更改
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\u 1
等作为输入,可以使用
.split(“
)检索索引号并将其用作字典键(它们可以是字符串或值)


关于使用索引变量名的小说明。如果您刚开始学习编程,有很多理由不使用
eval
exec
getattr
方法。最简单的是,它效率低下,不可伸缩,并且很难在脚本中的任何其他地方使用

我不是一个坚持“最佳实践”的人,如果有一种更简单的方法来做某事,但这是你想要学会避免的事情。我们编写程序是为了避免键入这样的内容

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

通过使用字典,您可以拥有1000个非连续变量,只需循环它们或分配新的关联即可。例如,如果您正在做一个实验,并调用您的值
tree\u 1
tree\u 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) 将变量设置为字符串:

stringized\u number=str(i)

2) 在运行时对表达式求值:


evaluated\u variable=eval('var\uu'+stringized\u number)
我建议在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)

如果有100个值,是否创建100个变量?使用数据结构来存储值(例如:list)。有一种方法可以做到这一点,但它几乎肯定不是您想要的。你听说过列表吗?使用字典或列表。如前所述,这基本上总是一个坏主意™这就陷入了这个难题。这看起来很痛苦,但确实有效。
只是为了确保
getattr(sys.modules[\uuuuu name\uuuuu],f“var{i}”)
我的变量var\u i正确吗?这是正确的
sys.modules[\uuuu name\uuu]
是当前模块,而'f“var{i}”是var 1到3。它只是用来访问变量的
test\u i
行在Python2和Python3中给了我一个语法错误,并且没有分配变量
test\u 1
test\u 2
等,只需重新使用
test\u i
@beroe f字符串语法是Python3.6+。谢天谢地,2.7已经快过时了,不再支持它,我建议你也放弃它。我把3.5也放在了同一条船上,它的原始版本是5年前发布的。我建议你升级。谢谢亚历山大。f字串看起来确实很有趣,但我忘了它们不在3.5中。通过这个,它只会将10100和100添加到列表中。它不计算10+1100+1和1000+1。谢谢。我修正了这一点,但重点只是为了展示所有
eval
答案的可能替代方案。谢谢您的解释。现在有了正确的代码,这似乎是最可读、最简单和低风险的解决方案。这会产生错误:“NameError:name'var_10'未定义”@MartinFlower刚刚删除了列表中的部分
var_1=10 var_2=100 var_3=1000,对于范围(1,4)内的i:test_i=eval('var_'+str(i))+1打印(test_i)
Right。这本书很好,易懂,可读性好。