无法修改随机生成的Python列表

-1 投票
1 回答
43 浏览
提问于 2025-04-14 17:06

我正在玩一个本地的k8s集群,创建了一个简单的应用程序来进行容器化。我的目标是打印一个反转的数组。需要说明的是,我可能会把“列表”和“数组”这两个词混用哦 :)

所以我定义了两个工具函数:一个用来生成包含随机整数值的列表,另一个用来反转这些列表。

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)]

这两个方法都有单元测试,所以我知道它们的功能是正常的。

然后我在主应用程序中执行它们:

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)

奇怪的是,应用程序的输出显示 reversed_arr 实际上和 input_arr 的顺序是一样的,但 control 是正确反转的。

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

这到底是怎么回事呢?看起来由 generate_random_array 生成的数组实际上是不可变的。

1 个回答

5

你的代码实际上是把数组反转了,你可以通过在反转之前打印出原始数组来看到这一点:

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}")

输出结果:

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

发生的事情是,你在修改(反转)原始数组,同时返回了一个指向同一个对象的“反转”数组,因此在反转后打印时你看不到区别。

你还会注意到,如果你改变了反转后的数组,原始数组也会跟着改变。它们其实是指向同一个对象的链接。

撰写回答