[英]Strange runtime error while iterating a dictionary
我运行了这段代码,并得到如下错误:
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())
。 这样,原始文件就不会引起问题。
发生错误的原因是Python认为,由于您通过键访问dict,因此可以更改dict,这在这里是受限制的。 为避免此错误,可以使用get
方法,然后您的语句将如下所示:
for k in l:
print k,"points to",l.get(k),"\n"
原因是您的循环引入了一个新的局部变量k,这意味着您的局部变量字典在循环中被更改。
最简单的解决方案是在循环之前定义k,以便一旦循环开始就不会更改locals()。
k = 0
l = locals()
for k in l:
print k,"points to",l[k],"\n"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.