Python Variable Contents Changed By Function When No Change Is Intended
Solution 1:
When you call doFile
try this instead:
doFile(inputFile, outputFile, list(good_ens), 'CF', l)
I think of it this way: A list is a thing which points to the value of each element within the list. When you pass a list into a function, the thing that does the pointing gets copied, but the values of the things pointed to do not get copied.
doing list(good_ens)
actually makes copies in memory of the elements of the list, and will keep the original values from getting changed. See below:
>>> def change_list(the_list):
... the_list[0] = 77
... return
...
>>> a=[0,1,2,3,4]
>>> change_list(a)
>>> a
[77, 1, 2, 3, 4]
>>>
>>> a=[0,1,2,3,4]
>>> change_list(list(a))
>>> a
[0, 1, 2, 3, 4]
EDIT: The reasoning for this is that, as the other answers have indicated, list is a mutable data type in python. Mutable data types can be changed, whereas immutable data types cannot be changed but rather return new objects when attempting to update.
Solution 2:
In python, lists are mutable.
>>> a = [1,2,3]
>>> def fun(d):
... d.append(55)
...
>>> a
[1, 2, 3]
>>> fun(a)
>>> a
[1, 2, 3, 55]
>>> fun(a[:])
>>> a
[1, 2, 3, 55]
>>> fun(a)
>>> a
[1, 2, 3, 55, 55]
If you want them to be immutable consider using a tuple.
Solution 3:
The other answers cover the idea that lists are mutable. Below is a possible refactoring that gets around this issue in what I think is a sensible way.
def doFile(infileName, outfileName, goodens, timetype, flen):
# ...
min_ens, max_ens = goodens
if max_ens < 0:
max_ens = flen
nens = max_ens - min_ens
# ...
This way, you can still call the function as you have been, your variables within the function are named more aptly, and you never mutate the provided list object.
Post a Comment for "Python Variable Contents Changed By Function When No Change Is Intended"