奇怪的 iPython 笔记本图形大小行为
Weird iPython Notebook figure size behavior
我在 iPython Notebook 中看到一个我不明白的奇怪效果。如果我将以下代码放在一个单元格中并 运行 两次,那么这两次图形都将使用我的自定义图形大小规格绘制。
%matplotlib inline
import matplotlib
matplotlib.rcParams['figure.figsize'] = (8,6)
import matplotlib.pyplot as plt
plt.plot([0,1],[1,2])
现在,如果我创建一个名为 set_figsize.py
的文件,其中包含以下行:
import matplotlib
matplotlib.rcParams['figure.figsize'] = (8.0, 6.0)
并在一个单元格中使用以下内容开始一个新笔记本:
%matplotlib inline
import set_figsize
import matplotlib.pyplot as plt
plt.plot([0,1],[1,2])
和 运行 两次,第一次使用我的自定义图形大小绘制图形,第二次返回较小的默认大小。如果我将 %matplotlib inline
放在一个单独的单元格中,并且只 运行 那一次,我的自定义图形大小将保持不变。所以好像每次我 运行 %matplotlib inline
图形大小都设置为默认值,但是 运行ning import set_figsize
只在我 运行 第一次生效它。为什么会这样?
一个模块的代码实际上只是运行第一次被导入。这对于防止函数和 类 等的双重定义以及允许循环导入(当两个模块都相互导入时)是必要的。
当你第二次 import set_figsize
时,Python 签入 sys.modules
并看到已经有一个名为 set_figsize
的模块对象导入,所以它只是使用那个对象。它不会再次 运行 文件。
因此,在大多数情况下,只应将 definitions 放在模块中是一个很好的规则。导入模块时,不要放入预期 运行 具有副作用的语句。如果你想写一个 Python script,一个你可以从命令行执行的脚本(python script.py
),把所有不是定义或导入的东西放在一个if __name__ == '__main__':
块。
我在 iPython Notebook 中看到一个我不明白的奇怪效果。如果我将以下代码放在一个单元格中并 运行 两次,那么这两次图形都将使用我的自定义图形大小规格绘制。
%matplotlib inline
import matplotlib
matplotlib.rcParams['figure.figsize'] = (8,6)
import matplotlib.pyplot as plt
plt.plot([0,1],[1,2])
现在,如果我创建一个名为 set_figsize.py
的文件,其中包含以下行:
import matplotlib
matplotlib.rcParams['figure.figsize'] = (8.0, 6.0)
并在一个单元格中使用以下内容开始一个新笔记本:
%matplotlib inline
import set_figsize
import matplotlib.pyplot as plt
plt.plot([0,1],[1,2])
和 运行 两次,第一次使用我的自定义图形大小绘制图形,第二次返回较小的默认大小。如果我将 %matplotlib inline
放在一个单独的单元格中,并且只 运行 那一次,我的自定义图形大小将保持不变。所以好像每次我 运行 %matplotlib inline
图形大小都设置为默认值,但是 运行ning import set_figsize
只在我 运行 第一次生效它。为什么会这样?
一个模块的代码实际上只是运行第一次被导入。这对于防止函数和 类 等的双重定义以及允许循环导入(当两个模块都相互导入时)是必要的。
当你第二次 import set_figsize
时,Python 签入 sys.modules
并看到已经有一个名为 set_figsize
的模块对象导入,所以它只是使用那个对象。它不会再次 运行 文件。
因此,在大多数情况下,只应将 definitions 放在模块中是一个很好的规则。导入模块时,不要放入预期 运行 具有副作用的语句。如果你想写一个 Python script,一个你可以从命令行执行的脚本(python script.py
),把所有不是定义或导入的东西放在一个if __name__ == '__main__':
块。