Python数组变量为何需用[:]赋值才会更新?LeetCode旋转数组解惑
旋转数组函数的赋值问题解答
核心原因:变量重新绑定 vs 原地修改列表内容
你的代码问题出在Python中变量赋值和切片赋值的本质区别:
- 函数接收的
nums参数,一开始指向的是LeetCode传入的原始列表对象。 - 前两行的
nums[:n - k] = ...和nums[n - k:] = ...都是原地修改原始列表:切片赋值操作会直接修改当前nums指向的列表对象的内容,不会改变变量的指向。 - 而
nums = nums[::-1]这行是重新绑定函数内部的nums变量:nums[::-1]会生成一个全新的反转列表,然后让函数里的nums变量指向这个新列表,完全和原始列表断开了关联。这时候原始列表的内容还是第6行执行后的状态,所以LeetCode判题时看不到最后一步的反转效果。
为什么nums[:] = nums[::-1]能解决问题
nums[:]代表取整个列表的切片,对这个切片赋值时,Python会把原始列表的所有元素替换成nums[::-1]生成的新列表的元素,整个过程是在原始列表对象上原地修改,没有改变变量的指向。这样LeetCode传入的原始列表内容就会被正确修改,判题系统就能得到预期的结果。
简单示例验证
def wrong_rotate(nums): nums = nums[::-1] # 重新绑定变量,原列表不变 def correct_rotate(nums): nums[:] = nums[::-1] # 原地修改原列表 a = [1,2,3] wrong_rotate(a) print(a) # 输出 [1,2,3],原列表未被修改 correct_rotate(a) print(a) # 输出 [3,2,1],原列表内容被修改
内容的提问来源于stack exchange,提问作者Aditya Raj
相关产品推荐
相关产品推荐

