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[:]
就像列表的单纯副本。但是话虽如此,为什么会发生这种输出变化?这两个命令中发生了什么?
我好像还不清楚 nums
和 nums[:]
。请帮忙。
说明
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)
我希望将 '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[:]
就像列表的单纯副本。但是话虽如此,为什么会发生这种输出变化?这两个命令中发生了什么?
我好像还不清楚 nums
和 nums[:]
。请帮忙。
说明
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)