Python: 用for循环改变变量后缀
Python: Change variable suffix with for loop
我知道这个问题被问了很多,但我无法with/understand 到目前为止的答案。
我想在 for 循环中更改变量的后缀。
我尝试了 Whosebug 搜索提供的所有答案。但是提问者经常给出的具体代码很难看懂。
所以为了清楚起见,我使用了一个简单的例子。这并不意味着面向应用程序。我只是想了解如何更改后缀。
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
进行更改。
与其采用复杂的命名约定,不如尝试使用诸如字典之类的数据结构来构思您的问题。
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
方法。最简单的是,它效率低下,不可扩展,并且极难在脚本的其他任何地方使用。
如果有更简单的方法,我不会坚持 "best practices",但这是您需要学习避免的事情。我们编写程序以避免必须键入这样的内容。
如果给定 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)
我建议在 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)
我知道这个问题被问了很多,但我无法with/understand 到目前为止的答案。
我想在 for 循环中更改变量的后缀。
我尝试了 Whosebug 搜索提供的所有答案。但是提问者经常给出的具体代码很难看懂。
所以为了清楚起见,我使用了一个简单的例子。这并不意味着面向应用程序。我只是想了解如何更改后缀。
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
进行更改。
与其采用复杂的命名约定,不如尝试使用诸如字典之类的数据结构来构思您的问题。
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
方法。最简单的是,它效率低下,不可扩展,并且极难在脚本的其他任何地方使用。
如果有更简单的方法,我不会坚持 "best practices",但这是您需要学习避免的事情。我们编写程序以避免必须键入这样的内容。
如果给定 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)
我建议在 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)