在set_bbox中使用dict()或大括号指定字典参数很重要

Lio*_*UEZ 7 python matplotlib

在matplotlib主页中,有一个Nicolas Rougier教程的链接.在标题为"Devil is the details"的教程部分中,脚本:

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

生成网页上显示的数字.脚本的第48行是:

label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65 ))
Run Code Online (Sandbox Code Playgroud)

如果我们将此行替换为:

label.set_bbox({"facecolor": "white", "edgecolor": "None","alpha":0.65})
Run Code Online (Sandbox Code Playgroud)

然后不考虑edgecolor请求.我原以为上面的两个陈述是等价的.我已经向教程的作者Nicolas Rougier询问了这个问题,他也很惊讶.这是Matplotlib的错误吗?

kin*_*all 4

您可以轻松确定两者是否dicts等效:

dict(facecolor='white', edgecolor='None', alpha=0.65 ) == \
    {"facecolor": "white", "edgecolor": "None", "alpha":0.65}
Run Code Online (Sandbox Code Playgroud)

这是True

但是,如果将这些文字输入 Python 解释器,则生成的字典repr将具有不同顺序的值。

{'alpha': 0.65000000000000002, 'facecolor': 'white', 'edgecolor': 'None'}
{'edgecolor': 'None', 'facecolor': 'white', 'alpha': 0.65000000000000002}
Run Code Online (Sandbox Code Playgroud)

这可能会根据您使用的 Python 版本而有所不同,并且我相信在较新版本的 Python 中,它会因解释器的运行而异;哈希种子是随机的,以防止恶意构建性能较差的字典。上面的输出来自 Python 2.6.6 (Win32)。

Pythondict是无序的,这意味着您不能依赖顺序。然而,当迭代字典时,元素必须按某种顺序出现。这个顺序受到项目插入顺序的影响,虽然不明显,但它们在这两个字典中以两种不同的顺序插入:构造函数dict()获取关键字字典,然后将其插入构造的dict,所以实际上第一个元素dict被插入了两次!首先按照您指定的顺序,然后按照它们最终出现在该步骤中构建的字典中的顺序。

假设:(或者你正在使用的 Python 版本)中有一些东西matplotlib关心字典项的出现顺序。事实上,由于第二个值edgecolor首先有它的键,所以它可能会跳过第一个值,或者可能是其中一个值后面的值有一个副作用,导致它被覆盖edgecolor(例如,facecolor也可能设置edgecolor以确保面之间没有间隙)。这可以合理地称为错误,因为行为可能会根据关键字从字典中出现的顺序而有所不同。