[英]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.