考虑下面的小python代码段,我将“2”添加到3x3矩阵的第一列:
import numpy as np
def changeValue(kernel):
kernel[0,0]=kernel[0,0]+ 2
kernel[1,0]=kernel[1,0]+ 2
kernel[2,0]=kernel[2,0]+ 2
return kernel
myKernel = np.array((
[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]), dtype="int")
CVkernel=myKernel
print(CVkernel)
a=changeValue(myKernel)
print(a)
print(CVkernel)
我得到以下输出
[[ 0 -1 0]
[-1 5 -1]
[ 0 -1 0]]
[[ 2 -1 0]
[ 1 5 -1]
[ 2 -1 0]]
[[ 2 -1 0]
[ 1 5 -1]
[ 2 -1 0]]
myKernel的值击碎了内核。我认为有一个无意的引用调用(passbyreference?)但我不知道为什么。你知道吗
如果我对函数的定义稍有不同
def changeValue2(kernel):
kernel=kernel + 2
return kernel
那么CVkernel就不会被触动
[[ 0 -1 0]
[-1 5 -1]
[ 0 -1 0]]
[[2 1 2]
[1 7 1]
[2 1 2]]
[[ 0 -1 0]
[-1 5 -1]
[ 0 -1 0]]
这是怎么回事?我试着用print(id(kernel))和print(id(CVkernel))打印出变量的地址寄存器,但没有任何效果。你知道吗
编辑 即使我使用“safe”函数调用,kernel=kernel+2,myKernel和CVkernel的id也是相同的。你知道吗
id of myKernel 139994865303344
myKernel
[[ 0 -1 0]
[-1 5 -1]
[ 0 -1 0]]
id of CVKernel 139994865303344
CVKernel
[[ 0 -1 0]
[-1 5 -1]
[ 0 -1 0]]
**call made to changeValue2**
id of myKernel 139994865303344
myKernel
[[ 0 -1 0]
[-1 5 -1]
[ 0 -1 0]]
id of CVKernel 139994865303344
CVKernel
[[ 0 -1 0]
[-1 5 -1]
[ 0 -1 0]]
output a
[[2 1 2]
[1 7 1]
[2 1 2]]
如果每个变量是不同的实例,那么它们的id不应该不同吗?你知道吗
我建议:
决不能直接修改对象内核 您传递给函数
changeValue2
。你知道吗请检查此链接 How arguments passed in python以了解在尝试修改参数时发生的实际情况
只需使用
changeValue
使用返回值:
myKernel = changeValue2(myKernel)
只需一份yaho cho的解决方案,再次感谢:)
请按以下方式尝试:
结果如下:
你很清楚它是
a call by reference
,但是在kernel = kernel + 2
的情况下,左边的kernel
变成了另一个实例。简单地说,它与newKernel = kernel + 2
相同。你知道吗所以,我把它改成了
kernel += 2
,它修改了原来的kernel
实例。你知道吗相关问题 更多 >
编程相关推荐