[New-bugs-announce] [issue36980] pass-by-reference clues
stefan
report at bugs.python.org
Mon May 20 20:31:29 EDT 2019
New submission from stefan <topjetboy at yahoo.com>:
I often get unexpected results when a called function results in a change in a variable because the function gets a pass by reference. For example, consider this snippet of code that manipulates the first column of a 3x3 matrix that it gets.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I get the following output
[[ 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]]
The value of myKernel clobbers CVkernel. I think there is an unintentional call-by-reference (pass-by-reference?) going on but I am not sure why.
If I define the function slightly differently
def changeValue2(kernel):
kernel=kernel + 2
return kernel
Then CVkernel is left untouched
[[ 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]]
What is going on here?
EDIT Even when I use a 'safe' function call that does not clobber CVkernel, like kernel=kernel + 2 , the id of myKernel and CVkernel are the same.
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]]
Shouldn't the id of each variable be different if they are different instances?
Would it possible for the python interpreter/compiler to let me know when a function is going to clobber a variable that is not used in the function or passed to the function or returned by the function
----------
messages: 342967
nosy: skypickle
priority: normal
severity: normal
status: open
title: pass-by-reference clues
type: behavior
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue36980>
_______________________________________
More information about the New-bugs-announce
mailing list