pythonでのQueue
キューの実装は複数あるが、queue.Queue
とcollections.deque
での差が問題になった。
もともとdeque
を使って書いていたものをQueue
を使って書き直した
もともとのコード
from collections import deque
queue = deque()
queue.append("hogehoge")
while queue:
item = queue.popleft()
if n := len(item) == 1:
print(item)
else:
queue.append(item[:n//2])
queue.append(item[n//2:])
書き直したコード
from queue import Queue
queue = Queue()
queue.put("hogehoge")
while queue:
item = queue.get()
if n := len(item) == 1:
print(item)
else:
queue.put(item[:n//2])
queue.put(item[n//2:])
この状態で下のコードを実行すると無限ループとなった。
Queue
は空のものもTrue
と判定される
https://docs.python.org/ja/3/library/queue.htmlには直接の記載はないがREPLではそのように出力された。
REPL
from queue import Queue
q = Queue()
bool(q)
> True
q.put("hoge")
bool(q)
> True
どうやらQueue.empty()
があるようなので使って書き直してみたが無限ループは解消されなかった。
Queue.empty()を使って書き直したコード
from queue import Queue
queue = Queue()
queue.put("hogehoge")
while not queue.empty():
item = queue.get()
if n := len(item) == 1:
print(item)
else:
queue.put(item[:n//2])
queue.put(item[n//2:])