Skip to main content
 首页 » 编程设计

python之迭代字典时出现奇怪的运行时错误

2025年05月04日10cloudgamer

我运行了这段代码并得到如下错误:

Traceback (most recent call last): 
  File "urllister.py", line 26, in <module> 
    for k in l: print k,"points to",l[k],"\n" 
RuntimeError: dictionary changed size during iteration 

我唯一做的就是在第 27 行的 for 循环中打印

from sgmllib import SGMLParser 
 
class URLLister(SGMLParser): 
    def reset(self): 
        SGMLParser.reset(self) 
        self.data = [] 
    def start_a(self, attrs): 
        href = [v for k , v in attrs if k == 'href'] 
        if href: 
            self.data.extend(href) 
 
if __name__ == '__main__': 
    import urllib 
    sock = urllib.urlopen("http://diveintopython.org") 
 
    parser = URLLister() 
    html = sock.read() 
 
    parser.feed(html) 
 
    sock.close() 
    parser.close() 
    for url in parser.data: print url 
    l = locals() 
 
    for k in l: 
        print k,"points to",l[k],"\n" 

请您参考如下方法:

原因是你循环引入了一个新的局部变量,k,这意味着你的局部变量字典在循环中被改变了。

最简单的解决方案(如果你真的需要这样做,虽然通常这是一个坏主意的标志)是复制字典 - 例如:l = dict(locals())。这样更新原件就不会出现问题。