在Python中更新列表时,For循环不会更新其范围

时间:2018-11-04 15:20:59

标签: python oop

作为使用Python中的面向对象编程的小型项目的一部分。我曾尝试为计算集群制作一个简单的设置/模拟程序。集群由一组机架组成,每个机架每个包含12个节点。我几乎已经完成了该程序,尽管我正努力了解为什么会发生这种情况以及如何解决它。

整个程序跨越三个类,一个节点,一个机架和一个集群。

我在这里试图做的是创建一个方法来检查机架是否已满(完全包含12个节点),如果是,则创建一个新的机架实例,然后用最新的机架实例填充节点。

这是集群的相关代码

class Cluster:
    def __init__(self, nodesPerRack, racks=[]):
        self.nodesPerRack = nodesPerRack
        self.racks = racks

    def addNode(self, node):
        if len(self.racks) == 0:
            newRack = Rack()
            self.racks.append(newRack)
            print(len(self.racks))

        for i in range(len(self.racks)):
            if self.racks[i].getNodes() < self.nodesPerRack:
                print("IM ADDING TO A RACK")

                self.racks[i].settInn(node)

            elif self.racks[i].getNodes() >= self.nodesPerRack:
                print("New rack is being made")
                newRack = Rack()

                newRack.insertInto(node)

                self.racks.append(newRack)

如果程序运行了,它似乎什么也没做,我怀疑它会生成无数的Rack实例,或者它会反复检查机架是否有空间(因此要消耗一堆ram?)

我尝试了几种方法,但我开始怀疑它所迭代的范围没有更新,即使添加了新的Rack元素,它也会挂起,这应该更新以下语句

for i in range(len(self.racks)):

我如何使for循环更新其范围?我尝试过使用以下方法使用while循环

i = 0
while i < self.nodesPerRack:
    do something
i += 1

它仍然使用与for循环相同的问题。

此外,这里是Rack

的相关部分
class Rack: 
    def __init__(self, nodes=[]):
        self.nodes = nodes

    def addTo(self, node):
        self.nodes.append(node)

和Node的类

class Node:
    def __init__(self, minne, antPros):
        self.minne = minne
        self.antpros = antPros

这是我用来开始测试的代码

from node import Node
from rack import Rack
from cluster import Cluster

cluster = Cluster(12)

for i in range(0,650):
    newNode = Node(64,1)
    cluster.addNode(newNode)

for i in range(0,16):
    newNode = Node(1024, 2)
    cluster.addNode(newNode)

2 个答案:

答案 0 :(得分:1)

range(len(self.racks))在执行该表达式时采用一次长度。 for循环不会在每次迭代时重新评估该表达式。

您可以通过遍历列表本身来避免整个问题:

for rack in self.racks:

,并使用rack代替self.racks[i]。为列表对象创建的迭代器保持连接到列表,并且每次您要求下一个值时,它都会重新检查长度。这意味着在循环内扩展的列表上的for循环也将迭代额外的元素:

>>> l = [42, 81]
>>> for i in l:
...     print(i)
...     if i == 42:
...         l.append(117)
...
42
81
117

在其他情况下,您可以使用while循环来每次对计数器的长度进行测试:

i = 0
while i < len(self.racks):
    # ...
    i += 1

while 会在每次迭代时重新计算表达式:

>>> l = [42, 81]
>>> i = 0
>>> while i < len(l):
...     print(l[i])
...     if l[i] == 42:
...         l.append(117)
...     i += 1
...
42
81
117

while循环对于此任务来说比较麻烦,因为现在您必须手动维护计数器,每次索引到self.racks列表中,很容易忘记或错过{{1 }}。

答案 1 :(得分:0)

除了马丁(Martijn)的答案外,我不确定是否

<system.web>
   <httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true"/>
</system.web>

通过方法名称返回节点的数量。如果返回它们,那我的答案就不重要了。