【问题标题】:How do you create different variable names while in a loop? [duplicate]在循环中如何创建不同的变量名? [复制]
【发布时间】:2011-09-05 03:11:16
【问题描述】:

例如目的...

for x in range(0,9):
    string'x' = "Hello"

所以我最终得到 string1、string2、string3... 都等于“Hello”

【问题讨论】:

  • 答案是你不想这样做。请改用列表。
  • 如果你想在这里使用它,你可以拥有x = ["Hello" * 9] 然后通过x[0], x[1] ... 访问它如果你想以不同的方式使用它,我认为你必须给我们一些更多代码背景。
  • 如果我曾经对一门语言拥有权力,那么在变量名中使用数字将给出SyntaxError: Use a data structure. ;-)
  • 别忘了你的 string0 ;)
  • @James Khoury:这不太对。这将导致x 成为一个包含单个元素的列表 - 字符串“HelloHelloHelloHelloHelloHelloHelloHello”。我想你的意思是x = ["Hello"] * 9

标签: python loops variables


【解决方案1】:

这确实是个坏主意,但是...

for x in range(0, 9):
    globals()['string%s' % x] = 'Hello'

然后例如:

print(string3)

会给你:

Hello

但是,这是不好的做法。正如其他人建议的那样,您应该改用字典或列表。当然,除非你真的很想知道怎么做,但又不想使用它。

【讨论】:

  • 你能详细说明为什么这是个坏主意吗?
  • @paintedcones:首先,应该有一种方法,使用简单的字典更自然。使用 globals 字典不是一个好主意,因为它也“隐式”创建全局变量或修改它们。由于以这种方式设置和修改变量都需要字典符号,因此没有理由使用globals() 而不是一些简单的dict
  • 在某些情况下确实需要制作一堆变量,x1、x2、x3 等。但在大多数情况下,使用字典确实是最合适的做法。
  • 您好 Tadeck,如何使用您的方法在 Json Array 循环上创建全局变量。 (对于 enumerate(items):) 中的项目。我没有确切的语法。拜托,你能帮帮我吗?
  • 这应该被标记为正确答案,而不是另一个。问题是如何动态创建变量,而不是“实现类似目标的最推荐方式”。
【解决方案2】:

我会使用一个列表:

string = []
for i in range(0, 9):
  string.append("Hello")

这样,您将有 9 个“Hello”,您可以像这样单独获取它们:

string[x]

x 将确定您想要哪个“Hello”。

所以,print(string[1]) 将打印 Hello

【讨论】:

  • 与某些语言不同,您不能分配给 Python 列表中尚不存在的元素(您将收到“列表分配索引超出范围”错误)。您可能想改用string.append("Hello")
  • 我应该知道的,谢谢你提醒我。它是固定的。
  • 你说得对,我正在考虑添加到字符串的末尾,而不是添加到数组中。我向大家道歉。
  • 学究式地'你会有 9 个“Hello”'应该是'你会有 1 个“Hello” 9 次'。重复的是同一个字符串,而不是九个不同的字符串。
【解决方案3】:

当然可以;它被称为dictionary

d = {}
for x in range(1, 10):
    d["string{0}".format(x)] = "Hello"
>>> d["string5"]
'Hello'
>>> d
{'string1': 'Hello',
 'string2': 'Hello',
 'string3': 'Hello',
 'string4': 'Hello',
 'string5': 'Hello',
 'string6': 'Hello',
 'string7': 'Hello',
 'string8': 'Hello',
 'string9': 'Hello'}

我说这话有点含糊其辞,但实际上将一个值与另一个值关联的最佳方式是字典。这就是它的设计目的!

【讨论】:

  • 这不应该被标记为正确答案,因为它不是;这是一本字典,而不是动态变量赋值,这是 OP 所要求的。
【解决方案4】:

创建变量变量名毫无意义。为什么?

  • 它们是不必要的:您可以将所有内容存储在列表、字典等中
  • 它们很难创建:你必须使用execglobals()
  • 您不能使用它们:如何编写使用这些变量的代码?你必须再次使用exec/globals()

使用列表要容易得多:

# 8 strings: `Hello String 0, .. ,Hello String 8`
strings = ["Hello String %d" % x for x in range(9)]
for string in strings: # you can loop over them
    print string
print string[6] # or pick any of them

【讨论】:

  • 谢谢!!我需要在字典或数据框列表中选择表格。而且由于我需要根据数据帧上的某个值对数据帧重新排序,所以我不能使用字典形式。嗯你是对的!在某些情况下,创建变量名真的毫无意义!
【解决方案5】:

不要用字典来做这个

import sys
this = sys.modules[__name__] # this is now your current namespace
for x in range(0,9):
    setattr(this, 'string%s' % x, 'Hello')

print string0
print string1
print string2
print string3
print string4
print string5
print string6
print string7
print string8

不要这样做,使用字典

globals() 有风险,因为它为您提供了名称空间当前指向的内容,但这可能会改变,因此修改 globals() 的返回不是一个好主意

【讨论】:

    【解决方案6】:

    使用exec() 可以做到这一点。例如:

    for k in range(5):
        exec(f'cat_{k} = k*2')
    
    >>> print(cat_0)
    0
    >>> print(cat_1)
    2
    >>> print(cat_2)
    4
    >>> print(cat_3)
    6
    >>> print(cat_4)
    8
    

    这里我利用了 Python 3.6+ 中方便的 f 字符串格式化

    【讨论】:

    • 记住 exec 某事,黑魔法,攻击漏洞,坏事,但它确实回答了所提出的问题。
    【解决方案7】:

    我认为这里的挑战是不调用 global()

    我会亲自为要保存的(动态)变量定义一个列表,然后在 for 循环中附加到它。 然后使用单独的 for 循环查看每个条目甚至执行其他操作。

    这是一个示例 - 我在各个分支机构有许多网络交换机(比如 2 到 8 个)。现在我需要确保我有一种方法可以确定在任何给定分支上有多少交换机可用(或活着 - ping 测试),然后对它们执行一些操作。

    这是我的代码:

    import requests
    import sys
    
    def switch_name(branchNum):
        # s is an empty list to start with
        s = []
        #this FOR loop is purely for creating and storing the dynamic variable names in s
        for x in range(1,8,+1):
            s.append("BR" + str(branchNum) + "SW0" + str(x))
    
        #this FOR loop is used to read each of the switch in list s and perform operations on
        for i in s:
            print(i,"\n")
            # other operations can be executed here too for each switch (i) - like SSH in using paramiko and changing switch interface VLAN etc.
    
    
    def main():  
    
        # for example's sake - hard coding the site code
        branchNum= "123"
        switch_name(branchNum)
    
    
    if __name__ == '__main__':
        main()
    

    输出是:

    BR123SW01

    BR123SW02

    BR123SW03

    BR123SW04

    BR123SW05

    BR123SW06

    BR123SW07

    【讨论】:

      【解决方案8】:
      for x in range(9):
          exec("string" + str(x) + " = 'hello'")
      

      这应该可行。

      【讨论】:

        【解决方案9】:

        使用字典应该是保存变量和相关值的正确方法,你可以使用这个:

        dict_ = {}
        for i in range(9):
             dict_['string%s' % i]  = 'Hello'
        

        但是如果你想将变量添加到局部变量中你可以使用:

        for i in range(9):
             exec('string%s = Hello' % i)
        

        例如,如果您想为它们分配值 0 到 8,您可以使用:

        for i in range(9):
             exec('string%s = %s' % (i,i))
        

        【讨论】:

          【解决方案10】:

          字典可以包含值,并且可以使用 update() 方法添加值。您希望您的系统创建变量,因此您应该知道将变量保存在哪里。

          variables = {}
          break_condition= True # Dont forget to add break condition to while loop if you dont want your system to go crazy.
          name = “variable”
          i = 0 
          name = name + str(i) #this will be your variable name.
          while True:
              value = 10 #value to assign
              variables.update(
                            {name:value})
              if break_condition == True:
                  break
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-24
            • 2019-04-29
            • 2013-06-12
            • 1970-01-01
            • 1970-01-01
            • 2022-01-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多