Python中文
首页
教程
问答
标签
搜索
登录
注册
python函数后变量发生意外更改
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>考虑下面的小python代码段,我将“2”添加到3x3矩阵的第一列:</p> <pre class="lang-py prettyprint-override"><code>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) </code></pre> <p>我得到以下输出</p> <pre><code>[[ 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]] </code></pre> <p>myKernel的值击碎了内核。我认为有一个无意的引用调用(passbyreference?)但我不知道为什么。你知道吗</p> <p>如果我对函数的定义稍有不同</p> <pre class="lang-py prettyprint-override"><code>def changeValue2(kernel): kernel=kernel + 2 return kernel </code></pre> <p>那么CVkernel就不会被触动</p> <pre><code>[[ 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]] </code></pre> <p><strong>这是怎么回事?</strong>我试着用print(id(kernel))和print(id(CVkernel))打印出变量的地址寄存器,但没有任何效果。你知道吗</p> <p><strong>编辑 即使我使用“safe”函数调用,kernel=kernel+2,myKernel和CVkernel的id也是相同的。你知道吗</p> <pre><code>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]] </code></pre> <p>如果每个变量是不同的实例,那么它们的id不应该不同吗?你知道吗</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>我建议:</p> <pre><code> CVkernel=myKernel.copy() </code></pre>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
如何在乒乓球比赛中预测球的轨迹,对于AI球拍预测?
10 回答
如何在乒乓球游戏中阻止球
9 回答
如何在乘法和模中不乘空间?
1 回答
如何在乘法和除以2个不同的数字之间进行交换?
5 回答
如何在也是数据一部分的单个字符上拆分大字符串
9 回答
如何在乾草堆中找到針,有更好的解決方案嗎?
4 回答
如何在事件wxWidgets中传递自定义数据
9 回答
如何在事件中使用lambda i=i?
6 回答
如何在事件中心只接收最近的数据
9 回答
如何在事件发生之前保持云函数运行?
2 回答
如何在事件发生后使页面重定向到同一页面
10 回答
如何在事件回调之间保持python生成器的状态
7 回答
如何在事件处理程序(pythonsocket、sphinx)中保留docstring
1 回答
如何在事件处理程序中更改wxRichTextCtrl的光标位置?
7 回答
如何在事件处理程序中访问外部对象?
5 回答
如何在事件循环中将协程打包为正常函数?
3 回答
如何在事件循环之外运行协同程序?
6 回答
如何在事件循环结束时为并发未来的所有线程调用类方法?
7 回答
如何在事件文件中只保留一份摘要?
5 回答
如何在事件模板中添加事件
6 回答