Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中异常的程序流和变量修改_Python_Matplotlib_Sequential - Fatal编程技术网

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

Python中异常的程序流和变量修改,python,matplotlib,sequential,Python,Matplotlib,Sequential,我试图修复我的阈值功能,因为它似乎没有正常工作。当我遇到一个奇怪的现象时,我真的觉得Python/编程中有些东西我真的不懂。 ` 这是错误的代码,我试图并排比较阈值函数tresh()对我正在处理的图像的影响 下面显示的两幅图像是相同的,即使阈值函数仅应用于显示的一个变量,即c。变量b在显示之前不会进行任何修改,但它的显示方式与已设置阈值的c相同 我试图通过在imshow()函数中隐式执行阈值来修复它,但令我惊讶的是,它居然成功了 我想不出一种方法来解释为什么原始代码片段会生成相同的图像,为什

我试图修复我的阈值功能,因为它似乎没有正常工作。当我遇到一个奇怪的现象时,我真的觉得Python/编程中有些东西我真的不懂。 `

这是错误的代码,我试图并排比较阈值函数
tresh()
对我正在处理的图像的影响

下面显示的两幅图像是相同的,即使阈值函数仅应用于显示的一个变量,即c。变量
b
在显示之前不会进行任何修改,但它的显示方式与已设置阈值的
c
相同

我试图通过在
imshow()
函数中隐式执行阈值来修复它,但令我惊讶的是,它居然成功了

我想不出一种方法来解释为什么原始代码片段会生成相同的图像,为什么我的“修复程序”会生成两个不同的图像

阈值函数

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    
def thresh(图像):
x=透镜(图像)
y=len(图像[0])
tresh=180
对于范围(x)内的ix:
对于范围(y)内的iy:

如果image[ix][iy]您的问题是由以下两个事实造成的:Python通过赋值传递参数(在您的例子中,
image
在函数中,
b
c
引用同一个对象),列表是可变对象(您可以根据对象的状态进行修改)

因此,当您在
thresh
内部修改
image
时,您正在修改底层对象,从而修改
b
c

为避免此问题,您需要将
b
的副本传递给函数(有关实现此功能的不同方法的更多信息,请参见此)

在您的情况下,您需要将代码更改为:

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

什么是“thresh”功能?它来自哪里?您确定
thresh
不会修改它的参数吗?如果执行
b=c.copy();c=thresh(c)
?我添加了该功能@user8153我将尝试这样做实际上,它看起来像是您的
thresh
函数直接修改其参数。它也没有提供返回值。有返回,我只是没有正确粘贴。谢谢。那么什么时候应该/不应该在python中使用return呢?这是一个巨大的问题。这纯粹是一个选项,但如果我创建了新值,我将返回它们。如果就地修改,则返回None。看见
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    
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()