列表nums与nums[:]的区别?从LeetCode46全排列看差异
LeetCode第46题递归解法:nums与nums[:]的区别解析
我在解决LeetCode第46题(给定不同整数组成的数组nums,返回所有可能的全排列,顺序不限)时,写了如下递归代码:
def rec(index, nums, ans): if(index == len(nums)): ans.append(nums) return for i in range(index, len(nums)): nums[index], nums[i] = nums[i], nums[index] rec(index+1, nums, ans) nums[index], nums[i] = nums[i], nums[index]
当输入nums为[1,2,3]时,用ans.append(nums)得到的输出全是[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]];改成ans.append(nums[:])后,才得到正确的全排列结果。
核心区别:
nums是对原列表的引用:Python里列表属于可变对象,直接appendnums,相当于把这个列表的内存地址添加到ans里。递归过程中,nums会被反复交换元素、回溯还原,最终所有存在ans里的引用,指向的都是最后回溯完成的同一个列表(也就是初始的[1,2,3]),所以输出全是相同的结果。nums[:]是生成原列表的浅拷贝:这会创建一个新的列表,和当前nums的内容完全一致,但占用独立的内存空间。每次append的都是当前状态下nums的副本,后续对原nums的修改不会影响这些已经存入ans的副本,因此能正确保存每一步生成的全排列。
内容的提问来源于stack exchange,提问作者Samridh Anand
相关产品推荐
相关产品推荐

