【问题标题】:How to connect strings in a list to the object to which the string refers [duplicate]如何将列表中的字符串连接到字符串引用的对象[重复]
【发布时间】:2020-01-09 17:46:52
【问题描述】:

我有一个绝对的思维障碍。 这是我的数据:

db_one = 1
db_two = 2
db_three = 3
db_four = 4
list_to_iterate = ['one','two','three','four']

for each_item in list_to_iterate:
    new_string = 'db_' + each_item
    print(new_string)

我想遍历list_to_iterate中的每个项目,在项目前加上'db_';然后返回该字符串所引用的对象,例如列表中的 'one' -> 转换为 'db_one' -> 打印出 1。

有人可以帮忙吗?

【问题讨论】:

  • 那么您是否尝试打印 object db_one,例如?
  • 因为如果你想引用一个名字一个关联的对象,dict 会更好地完成这个任务
  • 不要混合代码和数据;使用dict
  • 你可以使用locals()[new_string],但你真的不应该
  • @SlobodanIlic 但locals()[key] 在这种情况下仍然是字典的替代品

标签: python


【解决方案1】:

dict 替换 4 个同名变量,问题就消失了。

db = {
  'one': 1,
  'two': 2,
  'three': 3,
  'four': 4
}

list_to_iterate = ['one','two','three','four']

for each_item in list_to_iterate:
    new_string = db[each_item]
    print(new_string)

【讨论】:

    【解决方案2】:

    如果您尝试遍历对象集合,则必须将 nameobject 分开。这是一个很常见的陷阱,我们给值命名(我们称之为变量),因此假设这是访问它们的唯一方法。

    但是,在这种情况下,最好忽略名称。如果您有一堆需要访问的对象,只需将这些对象放入容器中:listsettupledict 等。

    如果名称对您来说比订单更重要,那么dict 可能是您的最佳选择:

    db1, db2, db3 = 1, 2, 3
    
    db_dict = {'db1': db1, 'db2': db2, 'db3': db3}
    
    for name, obj in db_dict.items():
        print(name, obj)
    
    db1 1
    db2 2
    db3 3
    

    否则,如果添加新名称(变量)会怎样?说我现在想要db4。好吧,我需要进去修改一下代码。这变得非常脆弱并且难以扩展。虽然您可以使用execglobals()locals(),但这通常被视为一种反模式,因为您并不真的需要这些名称,但您需要值本身,以及访问它们的一致方式。

    【讨论】:

      【解决方案3】:

      回答您的问题:如果您确实需要,可以使用locals(),如下所示:

      for item in list_to_iterate:
         key = "db_" + item
         print(locals()[key])
      

      但这听起来好像你需要使用不同的模式(也许是字典):

      objects = {"db_one": 1, "db_two": 2, "db_three": 3, "db_four": 4}
      items = ["one", "two", "three", "four"]
      for item in items:
          key = "db_" + item
          print(objects[key])
      

      【讨论】:

      • 一般来说,你不能那样使用locals,例如在函数内部
      【解决方案4】:

      您可以使用 eval 或 exec 执行此操作,如前所述,不鼓励这样做

      db_one = 1
      db_two = 2
      db_three = 3
      db_four = 4
      list_to_iterate = ['one','two','three','four']
      
      for each_item in list_to_iterate:
          new_string = 'db_' + each_item
          exec("print(%s)"%new_string)
      

      To convert string to variable name

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-05
        • 2012-04-17
        • 2015-01-21
        • 1970-01-01
        • 2017-01-17
        • 1970-01-01
        • 2019-03-03
        • 2017-04-24
        相关资源
        最近更新 更多