You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何循环中我的list变量candies每次迭代都会发生变化?

LeetCode刷题问题:列表变量意外被修改的原因及解决办法

我在刷LeetCode时遇到一个奇怪的问题,代码如下:

def kidsWithCandies(candies, extraCandies: int):
    output = []
    for enfant in range(len(candies)) :
        print(candies) #Show candies for debug
        test_candies = candies
        test_candies[enfant] = test_candies[enfant]+extraCandies
        is_great = True
        for enfant2 in range(len(test_candies)) :
            if enfant == enfant2 :
                continue
            if test_candies[enfant] < test_candies[enfant2] :
                is_great = False
        output.append(is_great)
    return output
print(kidsWithCandies([2,3,5,1,3],3))

运行后得到的输出:

[2, 3, 5, 1, 3]
[5, 3, 5, 1, 3]
[5, 6, 5, 1, 3]
[5, 6, 8, 1, 3]
[5, 6, 8, 4, 3]
[True, True, True, False, False]

奇怪的是,candies变量在每次循环中都会毫无明显缘由地发生变化,这是哪里理解错了?


问题根源

Python里列表是可变对象,当你执行test_candies = candies时,并没有创建一个新的列表,只是让test_candies指向了和candies同一个内存地址的列表。所以后续修改test_candies的元素时,本质上就是在修改原列表candies的内容,这才导致每次循环里candies的值都变了。

解决办法

要创建原列表的副本,而不是直接引用,常用的几种方式:

  • 使用切片:test_candies = candies[:]
  • 使用list()构造函数:test_candies = list(candies)
  • 使用copy模块的copy()方法(需要先导入import copy):test_candies = copy.copy(candies)

修正后的代码

def kidsWithCandies(candies, extraCandies: int):
    output = []
    for enfant in range(len(candies)) :
        print(candies) #Show candies for debug
        # 创建原列表的副本,避免修改原变量
        test_candies = candies[:]
        test_candies[enfant] = test_candies[enfant]+extraCandies
        is_great = True
        for enfant2 in range(len(test_candies)) :
            if enfant == enfant2 :
                continue
            if test_candies[enfant] < test_candies[enfant2] :
                is_great = False
        output.append(is_great)
    return output
print(kidsWithCandies([2,3,5,1,3],3))

运行后candies就不会再被修改,输出的调试信息会一直是[2, 3, 5, 1, 3],最终结果也会符合预期。

内容的提问来源于stack exchange,提问作者THE_DOCTOR01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:03:24