Python 为什么matplotlib.pyploy.imshow会更改它的轴?

Python 为什么matplotlib.pyploy.imshow会更改它的轴?,python,matplotlib,Python,Matplotlib,我尝试在不同的子图中绘制图像,但由于某些原因,图像的轴在绘制时会发生变化。为了证明这一点,在下面的示例中,我以4×2的子地块网格绘制图像,并不断检查第一幅图像的轴是否保持不变: import matplotlib.pyplot as plt import numpy as np _,ax = plt.subplots(4,2) ims = [[None]*2]*4 for i in range(4): for j in range(2): plt.sca(ax[i][

我尝试在不同的子图中绘制图像,但由于某些原因,图像的轴在绘制时会发生变化。为了证明这一点,在下面的示例中,我以4×2的子地块网格绘制图像,并不断检查第一幅图像的轴是否保持不变:

import matplotlib.pyplot as plt
import numpy as np
_,ax = plt.subplots(4,2)
ims = [[None]*2]*4
for i in range(4):
     for j in range(2):
         plt.sca(ax[i][j])
         ims[i][j] = plt.imshow(np.random.rand(10,10))
         print(ims[0][0].axes is ax[0][0])
输出表明,在绘制第三个图像后,第一个图像的轴发生了更改:

True
True
False
False
False
False
False
False
而且,事实证明这是正确的:

ims[0][0].axes is ax[3][0]
输出:

True
这让我感到困扰的原因是,我想在以后的步骤中使用ims[0][0].set_data()更新图像,但当我尝试这样做时,它们只在轴
ax[3][0]


行为是如何解释的,我如何解决它?

这里有一个解决方法。您可以创建单个列表并将
AxesImage
对象附加到该列表中。这正如预期的那样有效

import matplotlib.pyplot as plt
import numpy as np
_,ax = plt.subplots(4,2)
ims2=[]

for i in range(4):
     for j in range(2):
         im = ax[i][j].imshow(np.zeros(shape=(10,10)), vmin=0, vmax = 1)
         ims2.append(im)
         print(ims2[0].axes is ax[0][0])

for i in range(4):
     for j in range(2):   
         ims2[i*2+j].set_data(np.random.rand(10,10))

plt.show()

我无法很好地解释这个问题,但它与python列表有关。
这里,您正在使用

ims = [[None]*2]*4
这和

ims = [ [ None for j in range(2)] for i in range(4)]
尽管这两个命令都打印相同的列表。
使用第二种方法也适用。

我问了一个新问题,关于列表创建差异的确切原因: