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

エラーの理由は、キーで dict にアクセスするため、ここで制限されている dict を変更できると Python が考えているためです。このエラーを回避するには、getメソッドを使用すると、ステートメントは次のようになります。

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

これは、ループによって新しいローカル変数 k が導入されるためです。これは、ローカル変数の辞書がループ内で変更されることを意味します。

最も簡単な解決策は、ループの開始後に locals() が変更されないように、ループの前に k を定義することです。

k = 0
l = locals()

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