Python 列表参考和另一个副本

QUE*_*EEN 1 python reference list

我希望将“nums”数组的最后 k 个元素带到第一个元素。比如,输入:

nums = [1,2,3,4,5,6,7], k = 3
Run Code Online (Sandbox Code Playgroud)

输出:

[5,6,7,1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

我有以下代码:

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]
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,为什么产量会发生变化?在谷歌搜索和重新编辑该论坛中与“列表引用和复制”相关的某些其他线程时,我可以意识到这与nums = 列表引用有关,但nums[:]就像只是列表的副本。但话说回来,为什么产量会发生这种变化呢?这两个命令内部发生了什么?

我似乎numsnums[:]不清楚。请帮忙。

Sab*_*bil 5

解释

nums = nums[nk:] + nums[:nk]

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

1


nums[:] = nums[nk:] + nums[:nk]

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

2

在这种情况下,您不会更改变量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)

Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您将 k 传递给函数并返回 n,那么这一切都无关紧要,这会更正常(除非您在类上修改“self.nums”) (2认同)