簡體   English   中英

在Python中更新列表時,For循環不會更新其范圍

[英]For loop does not update its range when list gets updated in Python

作為使用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)

在執行該表達式時, 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列表中,很容易忘記或錯過結尾的i += 1

除了馬丁(Martijn)的答案,我不確定

self.racks[i].getNodes()

通過該方法的名稱返回節點的數量 如果返回它們,那我的答案就不重要了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM