I know the answer is probably super simple, but I'm absolutely stuck on this short piece of code. The function has no effect on the input list when I run it.
def squareEven(array):
for idx, val in enumerate(array):
if idx % 2 == 0:
val = val * val
else:
val = val
return array
array = [1, 2, 4, 9, 20]
print(squareEven(array))
CodePudding user response:
You can also use the list comprehension to construct a new list with squared values when the index is even.
def squareEven(array):
return [v**2 if i % 2 == 0 else v for (i, v) in enumerate(array)]
https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions
CodePudding user response:
Here are two ways, one bad, one good:
def squareEven(array):
for idx in range(len(array)):
if idx % 2 == 0:
array[idx] = array[idx] * array[idx]
return array
array = [1, 2, 4, 9, 20]
print(squareEven(array))
This is better, because it doesn't damage the original array as a side effect:
def squareEven(array):
new = []
for idx,val in enumerate(array):
if idx % 2 == 0:
new.append(val * val)
else:
new.append(val)
return new
array = [1, 2, 4, 9, 20]
print(squareEven(array))
CodePudding user response:
The reason is that the enumerate function does not actually change the array itself but just returns the new one for you to use in the loop. The simple solution is to save the enumerate(array) into another variable and return it at the end of your function. Keep in mind, you will get an enumerated array at the end. You could map it to convert to a form you initially passed.
In the function, you wrote you don't save the actual result. The variable val you used is temporary and changing it doesn't affect the array you passed. It means that val has the value from the array but not reference to the element. To solve the issue, you can directly change the element by referencing it with idx.
