【问题标题】:Python: Change variable suffix with for loopPython:使用 for 循环更改变量后缀
【发布时间】:2019-08-18 16:14:57
【问题描述】:

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

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

我尝试了 stackoverflow 搜索提供的所有答案。但是提问者经常提出的具体代码很难理解。

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

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 进行更改。

【问题讨论】:

  • 如果有 100 个值,你会创建 100 个变量吗?使用数据结构来存储值(例如:列表)。
  • 有一种方法可以做到这一点,但几乎可以肯定这不是您想要的。你听说过list吗?
  • 使用字典或列表。如前所述,这基本上总是一个坏主意™
  • 这就陷入了这个难题。 nedbatchelder.com/blog/201207/…

标签: python for-loop variable-names


【解决方案1】:

不要进行复杂的命名约定,而是尝试使用诸如字典之类的数据结构来构想您的问题。

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

这一行适用于任意数量的值。

【讨论】:

  • 这样它只会将 10,100 和 100 添加到列表中。它不计算 10+1,100+1 和 1000+1。
  • 谢谢。我解决了这个问题,但重点是展示所有eval 答案的可能替代方案。
  • 感谢您的解释。现在有了正确的代码,这似乎是最易读、最简单、风险最低的解决方案。
【解决方案2】:

我建议不要在 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)

【讨论】:

  • 这看起来很痛苦,但它确实有效。
    只是为了确保 getattr(sys.modules[__name__], f"var_{i}") 是我的变量 var_i 对吗?
  • 没错。 sys.modules[__name__] 是当前模块,而 `f"var_{i}" 是 var 1 到 3。getattr 只是用来访问变量
  • test_i 行在 python 2 和 3 中给了我一个语法错误,并且没有分配变量 test_1test_2 等,只是重复使用 test_i
  • @beroe f-string 语法是 python 3.6+。 2.7 即将推出(谢天谢地),almost all major libraries 不再支持它,我建议你也放弃它。鉴于there's almost no movement there,我也会将 3.5 放在同一条船上,它的原始版本是 5 年前。我建议你升级。
  • 谢谢亚历山大。 f-strings 看起来很有趣,但我忘记了它们不在 3.5 中。
【解决方案3】:
for i in range(1, 4):
   print(eval('var_' + str(i)))

一步一步:

1) 将变量设为字符串:

stringified_number = str(i)

2) 在运行时评估您的表达式:

evaluated_variable = eval('var_' + stringified_number)

【讨论】:

  • 这会产生错误:“NameError: name 'var_10' is not defined”
  • @MartinFlower 刚刚删除了列表中的部分
  • var_1 = 10 var_2 = 100 var_3 = 1000 for i in range(1, 4): test_i = eval('var_' + str(i)) + 1 print(test_i) 对。这工作正常,易于理解且可读性好。
猜你喜欢
  • 2010-11-06
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 2021-12-14
  • 2014-04-15
相关资源
最近更新 更多