Python 列表参考和另一个副本

Python list reference and just another copy

我希望将 'nums' 数组的最后 k 个元素放到第一个。喜欢,输入:

nums = [1,2,3,4,5,6,7], k = 3

输出:

[5,6,7,1,2,3,4]

我有以下代码:

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        k = k % n
        nums[:] = nums[n-k:] + nums[:n-k]

这工作得很好,即将最后的 k 个元素带到开头,nums 显示 [5,6,7,1,2,3,4]。但是,一旦我键入以下 nums = nums[n-k:] + nums[:n-k],它就会显示结果 nums 数组与原始 [1,2,3,4,5,6,7].

相同

我的问题是,为什么输出会发生变化?在谷歌搜索和重新阅读本论坛中与 'List Referencing and copying' 有关的某些其他线程时,我可以意识到 nums = 是关于列表引用的东西,但 nums[:] 就像列表的单纯副本。但是话虽如此,为什么会发生这种输出变化?这两个命令中发生了什么?

我好像还不清楚 numsnums[:]。请帮忙。

说明

nums = nums[n-k:] + nums[:n-k]

赋值 nums = nums[n-k:] + nums[:n-k] 相当于在内存中创建一个新列表(元素颠倒),并更改指针 nums 以指向该新列表。但是由于您更改的变量 nums 是函数的局部变量,因此此更改不会影响作为参数传递的外部变量。查看下图以便更好地理解:


nums[:] = nums[n-k:] + nums[:n-k]

赋值 nums[:] = nums[n-k:] + nums[:n-k] 相当于在 nums 指向的相同地址写入一个新的反向列表,因为切片允许用新内容替换列表的一部分。

在这种情况下,您没有更改变量 nums,而是更改它指向的数据。

示例代码:

def rotate(nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: None Do not return anything, modify nums in-place instead.
    """
    n = len(nums)
    k = k % n
    # in function
    # nums[:] = nums[n-k:] + nums[:n-k]
    nums = nums[n-k:] + nums[:n-k]

# in scope
nums = [1,2,3,4,5,6,7]
k = 3
rotate(nums, k)
print(nums)