มีปัญหาที่อาจเกิดขึ้นหากคุณเขียนการใช้งานแบบวนซ้ำของคุณเองหรือเทียบเท่ากับสแต็ก ดูตัวอย่างนี้:
dic = {}
dic["key1"] = {}
dic["key1"]["key1.1"] = "value1"
dic["key2"] = {}
dic["key2"]["key2.1"] = "value2"
dic["key2"]["key2.2"] = dic["key1"]
dic["key2"]["key2.3"] = dic
ตามปกติพจนานุกรมที่ซ้อนกันจะเป็นต้นไม้ n-nary เหมือนโครงสร้างข้อมูล แต่คำจำกัดความไม่ได้รวมถึงความเป็นไปได้ของการข้ามขอบหรือแม้แต่ขอบด้านหลัง (ดังนั้นจึงไม่ใช่ต้นไม้อีกต่อไป) ตัวอย่างเช่นที่นี่key2.2ถือไปยังพจนานุกรมจากkey1 , key2.3ชี้ไปยังพจนานุกรมทั้งหมด (back edge / cycle) เมื่อมีขอบด้านหลัง (รอบ) สแตก / การเรียกซ้ำจะทำงานไม่สิ้นสุด
root<-------back edge
/ \ |
_key1 __key2__ |
/ / \ \ |
|->key1.1 key2.1 key2.2 key2.3
| / | |
| value1 value2 |
| |
cross edge----------|
หากคุณพิมพ์พจนานุกรมนี้ด้วยการใช้งานจากScharron
def myprint(d):
for k, v in d.items():
if isinstance(v, dict):
myprint(v)
else:
print "{0} : {1}".format(k, v)
คุณจะเห็นข้อผิดพลาดนี้:
RuntimeError: maximum recursion depth exceeded while calling a Python object
เช่นเดียวกันกับการใช้งานจากผู้ส่ง senderle
ในทำนองเดียวกันคุณจะได้รับการวนซ้ำที่ไม่มีที่สิ้นสุดด้วยการใช้งานนี้จากFred Foo :
def myprint(d):
stack = list(d.items())
while stack:
k, v = stack.pop()
if isinstance(v, dict):
stack.extend(v.items())
else:
print("%s: %s" % (k, v))
อย่างไรก็ตาม Python ตรวจพบวัฏจักรในพจนานุกรมที่ซ้อนกัน:
print dic
{'key2': {'key2.1': 'value2', 'key2.3': {...},
'key2.2': {'key1.1': 'value1'}}, 'key1': {'key1.1': 'value1'}}
"{ ... }"คือที่ที่ตรวจพบวงจร
ตามที่Moondraร้องขอนี่เป็นวิธีหลีกเลี่ยงรอบ (DFS):
def myprint(d):
stack = list(d.items())
visited = set()
while stack:
k, v = stack.pop()
if isinstance(v, dict):
if k not in visited:
stack.extend(v.items())
else:
print("%s: %s" % (k, v))
visited.add(k)