gpt4 book ai didi

python - Python中异常的程序流程和变量修改

转载 作者:行者123 更新时间:2023-12-01 09:34:08 25 4
gpt4 key购买 nike

我正在尝试修复我的阈值函数,因为它似乎无法正常工作。就在这时,我遇到了一个奇怪的现象,这确实让我觉得我真的不理解 Python/编程。 `

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相同。

enter image description here

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() 函数内部隐式执行阈值来修复它,令我惊讶的是它起作用了。

enter image description here

我想不出一种方法来解释为什么原始代码片段产生相同的图像以及为什么我的“修复”设法产生两个不同的图像。

阈值函数,

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通过赋值传递参数(在你的例子中,函数内的imagebc引用同一个对象),列表是可变对象(您可以修改对象的状态)。

因此,当您在 thresh 内修改 image 时,您正在修改底层对象,从而修改 bc >.

为了避免此问题,您需要将 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()

另请注意,在这种情况下,您不需要在函数末尾返回image

关于python - Python中异常的程序流程和变量修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49682197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com