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

为何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这行代码:

  1. 第一次循环时,nums.pop()是原地修改传入的原始列表,弹出最后一个元素7,此时原始列表变为[1,2,3,4,5,6]。
  2. 但popped + nums会创建一个新的列表对象,然后把函数内部的局部变量nums重新指向这个新列表——这一步之后,函数内的nums和外部的原始列表就没有任何关联了。
  3. 后续两次循环的操作都是在这个新列表上进行的,不会再修改原始列表。
  4. 所以函数内部最后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:55:56