【问题标题】:Assigning variables through a for loop通过 for 循环分配变量
【发布时间】:2016-07-30 17:52:59
【问题描述】:

我正在尝试使用 for 循环为变量赋值 - 在这种情况下,变量都被称为:'die1'、'die2'、'die3' 等。

import random
for i in range(5):
    die[i] = random.randint(1,6)

我想要实现的是最终分配了一个随机数的 5 个变量。我尝试了几种不同的方法,但最终没有分配“die”变量,或者我无法使用“i”或我计算的其他变量。

【问题讨论】:

    标签: python python-3.x variables for-loop automation


    【解决方案1】:

    对于您的解释器,die1die2 等是不相关的实体。如果它们应该按照您的情况进行分组,请考虑使用list

    die = [random.randint(1,6) for _ in range(5)]
    

    现在可以访问die[0]die[1]等,如果确实需要自变量,可以使用:

    die1, die2, die3, die4, die5 = [random.randint(1,6) for _ in range(5)]
    

    但是,如果左侧变量的数量与右侧的 list/tuple 的长度不匹配,则会引发错误。出于灵活性考虑,我建议使用列表。

    【讨论】:

    • 有什么方法可以不使用列表,而只是将它们存储为单独的变量?我稍后有一个列表,如下所示:dice = [die1, die2, die3, die4, die5] 后面的函数被这样调用:dice[i] 'i' 通过 for 循环控制
    • 这是优雅的解决方案。
    • @Tym 您可以按照此处的说明创建您的dice 列表。如果你把它们塞进一个列表,那么首先创建独立变量是没有道理的。
    • 感谢您的更新 :)!我使用它们的原因只是因为我对列表不是很有信心......我知道这个借口很糟糕......
    • @Tym:你应该通过练习使用列表变得自信! :) 编写很多个使用列表的小程序,直到你对它们的行为感到满意为止。列表非常重要,尤其是在 Python 中,它有几个处理列表的强大功能。当代码有一堆像die1, die2, die3, die4, die5 这样的编号变量时,它几乎总是应该使用列表或元组(或者可能是字典)。使用一堆编号的变量会使代码变得比实际需要的更大、更混乱,从而更难开发和维护。
    【解决方案2】:

    我建议您创建一个固定大小的列表,以便您每次调用 append 时它都不会增长。

    import random
    
    die = [0] * 5
    
    def roll():
        for i in range(5):
            die[i] = random.randint(1, 6)
    

    现在您可以拨打roll 并更新模具列表。

    【讨论】:

    • 为什么列表增长不好?不必要地用零填充内存不是更糟糕吗?
    • @zondo 我假设他想要一个包含 5 个数字的列表。如果使用 append,则每次滚动调用都会将 5 个新数字附加到列表中,从而增加它。每次滚动调用都会使用新值更新五个数字的列表(最初为零)。所以没有内存填充,也没有每次都创建新列表。
    • 无论如何都不会创建新列表。如果您不喜欢不断增长的列表的想法,请使用列表理解:die = [random.randint(1, 6) for _ in range(5)]
    • @ThomasChristensen 实际上,append 不会创建新列表,至少不会每次都创建 ;) 。追加是 O(1):wiki.python.org/moin/TimeComplexity
    • @zondo list comprehensions 每次评估时都会创建一个新列表,对吗?
    【解决方案3】:

    假设目标是填充一个名为die 的列表,那么您可以定义它并在每次迭代时附加整数:

    import random
    
    die = []
    for _ in range(5):
        die.append(random.randint(1, 6))
    

    如果你指的是不同的变量,你可以使用vars动态定义它们:

    import random
    
    die1, die2, die3, die4, die5 = [0] * 5
    for i in range(5):
        vars()['die{}'.format(i)] = random.randint(1, 6)
    

    定义局部变量的行不是强制性的,尽管在 IDE 中使用它会更容易。

    如果你的意思是第一部分,或者变量很少的第二部分,我认为schwobaseggl的解决方案更优雅。

    【讨论】:

    • 感谢您的回复!介意我问你为什么在第一个中使用'_'来查找循环变量,而在第二个中使用'i'?另外 - 在第二部分中包含 vars() 的重要性是什么?
    • 在第一个循环中,i 没有被使用——python 中的一个常见约定是用_ 命名这种变量。
    【解决方案4】:

    如果变量的数量很大,可能无法在开头提及所有变量名称。相反,它们可以在 for 循环的每次迭代中创建并作为键存储在字典中,而与它们关联的随机数可以作为它们的值存储在字典中。

    您可以使用字符串连接来创建变量名称,例如 'die'+'1' = 'die1' 。如果您将 'die1' 称为 'n',则将一个新键添加到字典中,为 Dict[n]=randint(1,6) 其中 randint(1,6) 是对应于 'die1' 的值。这样您就可以轻松地将这些变量用于数学运算。

    from random import randint
    Dict={}
    count=1
    for i in range(5):
        n='die'+str(count)
        DICT[n]=randint(1,6)
        count=count+1
        print DICT
    print DICT['die1'],DICT['die2']
    print DICT['die1']+DICT['die2']
    

    【讨论】:

      猜你喜欢
      • 2015-07-07
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多