Python for循环:执行第二行会覆盖第一行中创建的对象

时间:2019-02-13 21:01:45

标签: python object for-loop overwrite

我是Python的新手,希望使用for循环来分析图像的垂直切片。我的for循环在每行单独执行时起作用。但是,当一起执行时,第一行中创建的对象将采用第二行中创建的对象的值。

# create image of random noise 
im = np.random.randint(0,255,(100,200)) 

# create empty y and dy objects with same size as original image
empty = np.zeros([im.shape[0],im.shape[1]])
y = empty
dy = empty

# get pixel intensities in vertical strips, and then take first derivative 
for i in xrange(im.shape[1]):
    y[:,i] = im[:,i].astype(np.int32) 
    dy[:,i] = np.insert(diff(y[:,i]),0,0) 

我希望获得与图像y相同的对象im,以及与dy和{{1}相同尺寸的对象im },但包含代表沿图像垂直方向像素强度的一阶导数的值。

相反,我看到y已正确计算,但dy已被与y相同的值所覆盖。为什么dy对象被覆盖?

为了澄清这一点:我的原始图片是“ uint8”,无法区分。我必须转换为“ int32”来计算导数。对于y,示例图像已经在np.random.randint()中。因此,在提供的示例中无需创建对象int32,但是我需要它来获取图像切片的导数。

1 个答案:

答案 0 :(得分:2)

您遇到复印问题。第一次看到这个,我也感到困惑!如果您查看empty,将会发现它也包含与ydy相同的值。

要解决此问题,您需要将代码更改为:

empty = np.zeros([im.shape[0],im.shape[1]])
y = empty.copy()
dy = empty.copy()

当您定义empty时,会在内存中创建一个对象,并且empty指向该对象。

设置y = emptydy = empty时,不会在内存中创建新的数组。 ydy只是指向同一数组的指针!因此,现在您拥有ydyempty都指向同一个对象。

因此,修改ydyempty中的任何一个都会导致它们全部更改。