gpt4 book ai didi

python - python函数调用后变量的意外变化

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:34 24 4
gpt4 key购买 nike

考虑以下小 python 片段,其中我将“2”添加到 3 x 3 矩阵的第一列:

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 的值破坏了 CVkernel。我认为正在进行无意的按引用调用(按引用传递?),但我不确定为什么。

如果我对函数的定义略有不同

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)) 打印出变量的地址寄存器,但没有任何效果。

编辑即使当我使用“安全”函数调用时, 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 不应该不同吗?

最佳答案

尝试如下:

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]]

你很清楚这是通过引用调用,但是,在kernel = kernel + 2的情况下,左边的kernel变成了另一个实例。简单地说,它与 newKernel = kernel + 2 相同。

因此,我将其更改为kernel += 2,它修改了原始kernel实例。

关于python - python函数调用后变量的意外变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56204395/

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