python函数后变量发生意外更改

2024-10-02 22:30:00 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑下面的小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不应该不同吗?你知道吗


Tags: ofimportidreturndef代码段np矩阵
3条回答

我建议:

    CVkernel=myKernel.copy()

Reason

决不能直接修改对象内核 您传递给函数changeValue2。你知道吗

请检查此链接 How arguments passed in python以了解在尝试修改参数时发生的实际情况

Solution:

  1. 只需使用changeValue

  2. 使用返回值:myKernel = changeValue2(myKernel)

  3. 只需一份yaho cho的解决方案,再次感谢:)

def changeValue2(kernel):
    kernel += 2 
    return kernel

请按以下方式尝试:

def changeValue2(kernel):
    kernel += 2 
    return kernel

结果如下:

[[ 0 -1  0]
 [-1  5 -1]
 [ 0 -1  0]]
[[2 1 2]
 [1 7 1]
 [2 1 2]]
[[2 1 2]
 [1 7 1]
 [2 1 2]]

你很清楚它是a call by reference,但是在kernel = kernel + 2的情况下,左边的kernel变成了另一个实例。简单地说,它与newKernel = kernel + 2相同。你知道吗

所以,我把它改成了kernel += 2,它修改了原来的kernel实例。你知道吗

相关问题 更多 >