LoginSignup
1
1

More than 3 years have passed since last update.

pythonで`while queue`がうまく行かなかった話

Posted at

pythonでのQueue

キューの実装は複数あるが、queue.Queuecollections.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:])
1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1