【问题标题】:How do you make an identifier out of concatenated strings in Python 3你如何在 Python 3 中从连接的字符串中创建一个标识符
【发布时间】:2010-12-25 22:19:59
【问题描述】:

基本上我想将一个字符串转换为一个对象的标识符,如下所示:

count = 0
for i in range(50):
   count += 1
   functionToMakeIdentifier("foo" + str(count)) = Object(init_variable)

我想制作一系列名称为 foo1、foo2、foo3、foo4、foo5 等的对象...但我不知道如何将这些字符串转换为对象的标识符。救命!

【问题讨论】:

  • 为什么你认为你需要这个?
  • 我为什么需要这个?如果我想制作 50 个或一百万个对象,而无需输入每个对象的名称!
  • 请阅读介绍性编程文本,了解什么是数组。
  • @user539718,我认为你对格伦的评论读得太多了。这是一个致力于帮助人们解决编程问题的网站。我们不能在这里假设任何水平的知识。您的问题是通过使用数组来解决的,实际上您要完成的是数组背后的整个想法。这就是为什么 Glenn 建议你阅读它们。

标签: python python-3.x identifier


【解决方案1】:

你不需要。如果你想/需要使用比连续整数(例如字符串)更花哨的东西来识别个人,你可以使用数组(也就是 Python 中的列表)或字典项目。

例如:

foos = []
count = 0
for i in range(50):
   count += 1
   foos.append(Object(init_variable))

之后,您可以将第一个 foo 称为 foos[0] 并将第 50 个 foo 称为 foo[49](索引从 0 开始 - 确实看起来很奇怪,但是一旦您习惯了它,它至少是只要每个人都同意一件事就可以了——而且 Python 鼓励从 0 开始的索引,例如 range 从 0 开始计数。

此外,您的代码还可以进一步简化。如果您只想生成Object 实例的列表,您可以使用列表理解(可能需要一段时间,直到您的课程、书籍或教程涵盖此内容......)。此外,在您的具体示例中,counti 是相同的,因此可以合并(当您想计算像 for item in items: ... 这样的迭代时,您可以使用 for count, item in enumerate(items))。

【讨论】:

  • 啊哈,这个列表确实有道理。感谢您的详细解答。
【解决方案2】:

改为这样做:

foos = [Object(init_variable) for _ in range(50)]
print(foos[0]) # first item

您现在有一个包含 50 个Object 项目的列表。

也许,如果你真的想使用这些 foo1 字符串,你可以这样做

foo_dict = {'foo%d'.format(i) : Object(init_variable) for i in range(1,51)]
print(foo_dict['foo1'])

【讨论】:

    【解决方案3】:

    您的用例很荒谬,因为有人会为此使用数组...但是假设您确实需要它,那么诀窍就是使用

    globals()[name] = value
    

    【讨论】:

      【解决方案4】:

      你在找字典吗?

      你可以这样做:

      foos = {}
      for i in range(50):
         foos['foo%d' % i] = MyObject()
      

      并使用keys() 创建一个字典,例如['foo1', 'foo2', ...] 以访问您的对象。

      【讨论】:

        【解决方案5】:

        使用 exec 函数:

        >>> for i in range(50):
        ...    count += 1
        ...    exec("foo%d = %d" % (count,count))
        ... 
        >>> foo1
        1
        >>> foo2
        2
        >>> foo3
        3
        

        【讨论】:

        • 技术上它可以工作,但它只是可怕的代码。因此 -1 表示建议。
        • 你可以肯定我会利用 Python 的动态特性,只要它们是最好的解决方案。在这种情况下,它们不是——甚至不是远程的。
        • Exec 会在那里解决问题,但这是一个昂贵的调用,并不是真正的“正确”方法。
        • 50个元素的昂贵调用,你不敢说。
        • 这可能是 OP 要求的,但您只是在为他设置下一个问题:“我如何循环变量 foo<n>?”
        猜你喜欢
        • 1970-01-01
        • 2015-12-15
        • 1970-01-01
        • 2013-12-03
        • 2022-10-05
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        相关资源
        最近更新 更多