为何Python方法外部print与方法内最终print的数组输出结果不同?
为何方法内外的print语句输出数组结果不一致?
问题代码
class Solution(object): def rotate(self, nums, k): for i in range(k): popped = [nums.pop()] nums = popped + nums print(nums) print(nums) nums = [1, 2, 3, 4, 5, 6, 7] k = 3 Solution().rotate(nums, k) print(nums)
预期输出
[7, 1, 2, 3, 4, 5, 6] [6, 7, 1, 2, 3, 4, 5] [5, 6, 7, 1, 2, 3, 4] [5, 6, 7, 1, 2, 3, 4] [5, 6, 7, 1, 2, 3, 4]
实际输出
[7, 1, 2, 3, 4, 5, 6] [6, 7, 1, 2, 3, 4, 5] [5, 6, 7, 1, 2, 3, 4] [5, 6, 7, 1, 2, 3, 4] [1, 2, 3, 4, 5, 6]
原因分析
问题出在函数内部的nums = popped + nums这行代码:
- 第一次循环时,
nums.pop()是原地修改传入的原始列表,弹出最后一个元素7,此时原始列表变为[1,2,3,4,5,6]。 - 但
popped + nums会创建一个新的列表对象,然后把函数内部的局部变量nums重新指向这个新列表——这一步之后,函数内的nums和外部的原始列表就没有任何关联了。 - 后续两次循环的操作都是在这个新列表上进行的,不会再修改原始列表。
- 所以函数内部最后print的是经过三次旋转的新列表,而外部print的是只被弹出过一次元素的原始列表,结果自然不一致。
修正方案
如果要让函数修改原始列表,不要重新赋值nums,改用列表的原地修改方法,比如insert:
class Solution(object): def rotate(self, nums, k): for i in range(k): # 弹出最后一个元素,插入到列表头部,全程操作原始列表 nums.insert(0, nums.pop()) print(nums) print(nums) nums = [1, 2, 3, 4, 5, 6, 7] k = 3 Solution().rotate(nums, k) print(nums)
运行这段代码,函数内外的print输出就会和预期一致。
内容的提问来源于stack exchange,提问作者James Quarmby
相关产品推荐
相关产品推荐

