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[:]就像只是列表的副本。但话说回来,为什么产量会发生这种变化呢?这两个命令内部发生了什么?
我似乎nums还nums[:]不清楚。请帮忙。
该赋值nums = nums[n-k:] + nums[:n-k]相当于在内存中创建一个新列表(元素相反),并将指针更改nums为指向该新列表。但由于您更改的变量nums是函数的本地变量,因此这一更改不会影响作为参数传递的外部变量。检查下图以更好地理解:
该赋值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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |