EN VI

Cannot mutate a Python randomly generated list?

2024-03-10 21:30:04
How to Cannot mutate a Python randomly generated list

I'm just playing around with a local k8s cluster and created a simple app to containerize. I just want to print a reversed array. Disclaimer: I might be using the words "lists" and "arrays" interchangeably here :)

So I defined two utility functions: one to generate lists with random int values and one to reverse said lists.

from random import randint

def reverse_array(input):
    i=0
    arr_length = len(input)
    last_index = arr_length - 1
    while i < arr_length / 2:
        temp = input[i]
        input[i] = input[last_index - i]
        input[last_index - i] = temp
        i=i+1
    return input

def generate_random_array(max_iteration):
    return [randint(0, 100) for _ in range(0, max_iteration)]

Both methods have unit tests, so I know they're working as intended

then I execute them in the main app:

import util.misc as misc
from time import sleep

while True:
    input_arr = misc.generate_random_array(5)
    reversed_arr = misc.reverse_array(input_arr)
    
    # adding manual and control only for debugging
    manual = [1, 2, 3]
    control= misc.reverse_array(manual)
    print(f"your original array is {input_arr}")
    print(f"your reversed array is {reversed_arr}")
    print(f"control is {control}")
    sleep(1)

Oddly enough, the application's output shows reversed_arr actually has the same order as input_arr, but control is correctly reversed.

your original array is [27, 95, 0, 91, 13]
your reversed array is [27, 95, 0, 91, 13]
control is [3, 2, 1]

What is going on here? It seems that arrays produced by generate_random_array are actually immutable

Solution:

Your code actually reverses the array, you can see that by printing out the original array before reverse:

input_arr = generate_random_array(5)
print(f"your original array is {input_arr}")

reversed_arr = reverse_array(input_arr)
print(f"your reversed array is {reversed_arr}")

Output:

your original array is [15, 69, 31, 14, 34]
your reversed array is [34, 14, 31, 69, 15]

What happens is you're mutating (reversing) the original array and also returning a link to the same object as "reversed" array, therefore you can't see the difference when printing after the reverse.

You can also notice that if you change the reversed array, the original will change too. They're just links to the same object.

Answer

Login


Forgot Your Password?

Create Account


Lost your password? Please enter your email address. You will receive a link to create a new password.

Reset Password

Back to login