1

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

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"
4

3 回答 3

10

这样做的原因是您循环引入了一个新的局部变量 ,k这意味着您的局部变量字典在循环中发生了更改。

最简单的解决方案(如果你真的需要这样做,尽管通常这是一个坏主意的标志)是复制字典 - 例如:l = dict(locals()). 这样,被更新的原始文件不会引起问题。

于 2013-01-03T17:32:42.507 回答
0

错误的原因是 Python 认为,既然你通过 key 访问 dict,你可以改变 dict,这里是限制的。为避免此错误,您可以使用get方法,然后您的语句将如下所示:

for k in l:
    print k,"points to",l.get(k),"\n"
于 2013-04-09T09:48:48.577 回答
0

这样做的原因是您循环引入了一个新的局部变量 k,这意味着您的局部变量字典在循环中发生了更改。

最简单的解决方案是在循环之前定义 k ,这样 locals() 在循环开始后就不会改变。

k = 0
l = locals()

for k in l:
    print k,"points to",l[k],"\n"
于 2015-11-25T09:31:42.607 回答