Python中异常的程序流程和变量修改
Unusual program flow and variable modification in Python
我正在尝试修复我的阈值函数,因为它似乎无法正常工作。这是当我遇到一个奇怪的现象时,真的让我觉得我真的不明白Python/programming。
`
b = c
c = thresh(c)
plt.subplot(121),plt.imshow(b,cmap='gray'),plt.title('C')
plt.subplot(122),plt.imshow((c),cmap='gray'),plt.title('C tresh')
plt.show()
这是错误的代码,我试图并排比较以查看我的阈值函数 tresh()
对我正在处理的图像的影响。
下面显示的两个图像是相同的,即使阈值函数只应用于显示的变量之一,即 c。变量b
在显示前根本没有被修改,但它的显示方式与c
一样,已经过阈值。
b = c
plt.subplot(121),plt.imshow(b,cmap='gray'),plt.title('C')
plt.subplot(122),plt.imshow(thresh(c),cmap='gray'),plt.title('C tresh')
plt.show()
我试图通过在 imshow()
函数内部隐式执行阈值来修复它,令我惊讶的是它起作用了。
我想不出一种方法来解释为什么原始代码片段生成相同的图像以及为什么我的 "fix" 设法生成两个不同的图像。
阈值函数,
def thresh(image):
x = len(image)
y = len(image[0])
tresh = 180
for ix in range(x):
for iy in range(y):
if image[ix][iy] <tresh:
image[ix][iy] = 0
return image
你的问题是由于两个事实:Python 通过赋值传递参数(在你的例子中 image
在你的函数中,b
和 c
指的是相同的对象),列表是可变对象(您可以修改对象的状态)。
因此,当您在 thresh
内修改 image
时,您正在修改基础对象,因此 b
和 c
。
为避免此问题,您需要将 b
的副本传递给该函数(有关实现它的不同方法的更多信息,请参阅此 question and corresponding answers)。
对于您的情况,您需要将代码更改为:
from copy import deepcopy
b = deepcopy(c)
c = thresh(c)
plt.subplot(121),plt.imshow(b,cmap='gray'),plt.title('C')
plt.subplot(122),plt.imshow((c),cmap='gray'),plt.title('C tresh')
plt.show()
另请注意,在这种情况下,您不需要在函数末尾 return image
。
我正在尝试修复我的阈值函数,因为它似乎无法正常工作。这是当我遇到一个奇怪的现象时,真的让我觉得我真的不明白Python/programming。 `
b = c
c = thresh(c)
plt.subplot(121),plt.imshow(b,cmap='gray'),plt.title('C')
plt.subplot(122),plt.imshow((c),cmap='gray'),plt.title('C tresh')
plt.show()
这是错误的代码,我试图并排比较以查看我的阈值函数 tresh()
对我正在处理的图像的影响。
下面显示的两个图像是相同的,即使阈值函数只应用于显示的变量之一,即 c。变量b
在显示前根本没有被修改,但它的显示方式与c
一样,已经过阈值。
b = c
plt.subplot(121),plt.imshow(b,cmap='gray'),plt.title('C')
plt.subplot(122),plt.imshow(thresh(c),cmap='gray'),plt.title('C tresh')
plt.show()
我试图通过在 imshow()
函数内部隐式执行阈值来修复它,令我惊讶的是它起作用了。
我想不出一种方法来解释为什么原始代码片段生成相同的图像以及为什么我的 "fix" 设法生成两个不同的图像。
阈值函数,
def thresh(image):
x = len(image)
y = len(image[0])
tresh = 180
for ix in range(x):
for iy in range(y):
if image[ix][iy] <tresh:
image[ix][iy] = 0
return image
你的问题是由于两个事实:Python 通过赋值传递参数(在你的例子中 image
在你的函数中,b
和 c
指的是相同的对象),列表是可变对象(您可以修改对象的状态)。
因此,当您在 thresh
内修改 image
时,您正在修改基础对象,因此 b
和 c
。
为避免此问题,您需要将 b
的副本传递给该函数(有关实现它的不同方法的更多信息,请参阅此 question and corresponding answers)。
对于您的情况,您需要将代码更改为:
from copy import deepcopy
b = deepcopy(c)
c = thresh(c)
plt.subplot(121),plt.imshow(b,cmap='gray'),plt.title('C')
plt.subplot(122),plt.imshow((c),cmap='gray'),plt.title('C tresh')
plt.show()
另请注意,在这种情况下,您不需要在函数末尾 return image
。