为何循环中我的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
相关产品推荐
相关产品推荐

