7

matplotlib のホームページには、Nicolas Rougier によるチュートリアルへのリンクがあります。「悪魔は細部に宿る」というタイトルのチュートリアルのセクションで、スクリプトは次のようになります。

http://www.loria.fr/~rougier/teaching/matplotlib/scripts/exercice_10.py

Web ページに表示される図を生成します。スクリプトの 48 行目は次のとおりです。

label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65 ))

この行を次のように置き換えると:

label.set_bbox({"facecolor": "white", "edgecolor": "None","alpha":0.65})

その場合、edgecolor リクエストは考慮されません。上記の2つのステートメントは同等であると考えていたでしょう。チュートリアルの作者である Nicolas Rougier にこれについて尋ねたところ、彼も驚いていました。これは Matplotlib のバグですか?

4

2 に答える 2

4

dicts2 つが同等かどうかは簡単に判断できます。

dict(facecolor='white', edgecolor='None', alpha=0.65 ) == \
    {"facecolor": "white", "edgecolor": "None", "alpha":0.65}

これはTrue

ただし、これらのリテラルを Python インタープリターに入力すると、結果reprの辞書には異なる順序で値が含まれます。

{'alpha': 0.65000000000000002, 'facecolor': 'white', 'edgecolor': 'None'}
{'edgecolor': 'None', 'facecolor': 'white', 'alpha': 0.65000000000000002}

これは、使用している Python のバージョンによって異なる場合があります。新しいバージョンの Python では、インタープリターの実行ごとに異なると思います。ハッシュ シードはランダム化され、辞書が悪意を持って低パフォーマンスで構築されるのを防ぎます。上記の出力は Python 2.6.6 (Win32) からのものです。

Pythondictは順序付けされていません。つまり、順序に依存することはできません。ただし、辞書を反復処理する場合、要素は何らかの順序で出てくる必要があります。この順序は、アイテムが挿入される順序に影響されます。明らかではありませんが、これらの 2 つの辞書では 2 つの異なる順序で挿入されます。dict()コンストラクターはキーワードの辞書を取得し、それを構築された に挿入しますdict。つまり、最初の要素がdict2 回挿入されます。最初に指定した順序で、次にそのステップで構築された辞書に最終的に含まれる順序で。

仮説: matplotlib(または使用している Python のバージョン) には、辞書項目がどの順序で表示されるかを気にするものがありますedgecolor。後の値には、それをオーバーライドする副作用がありますedgecolor(たとえば、面間に隙間がないようにfacecolor設定することもできます)。edgecolorこれは、キーワードがたまたま辞書から出てくる順序に基づいて動作が異なる可能性があるため、バグと呼ぶのが妥当かもしれません。

于 2013-04-19T15:33:31.340 に答える