python 数组通过传参修改为什么必须用num[:]

刷leetcode时,题目“翻转数组”下发现一个问题:

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.
        """

        k %= len(nums)
        nums[:] = nums[-k:] + nums[:-k]

而最后一句当我用nums = nums[-k:] + nums[:-k],就会出错。
原因是新建了一个与参数重名的局部变量,而使用nums[:]就可以,原理是什么呢。

我又试了一下如下代码

a = [1, 2, 3]

print(id(a))
print(id(a[:]))

a = [4, 5, 6]
print(id(a))
print(id(a[:]))
print(a)

输出是这样的

2284479734280
2284479734344
2284479734344
2284479734280
[4, 5, 6]

想请教一下nums和nums[:]的区别。感谢!

2个回答

如果不加[:]编译会认为是创建局部变量,[:]是对数组进行操作,编译器当然会找已经存在的变量,python又是引用传值当然就改了。

ywh4214
YWH98 明白了,感谢!
4 个月之前 回复

我这里测试了,无论num或者num[:]都不会报错,但是也不会修改数组

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.
        """

        k %= len(nums)
        nums[:] = nums[-k:] + nums[:-k]

nums = [1,2,3]
k=3
s=Solution()
s.rotate(nums, k)
print(nums)
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复YWH98: 所以你问题不说清楚怪我咯
4 个月之前 回复
ywh4214
YWH98 回复贵阳老马马善福专业维修游泳池堵漏防水工程: 我的出错指不会修改数组,并且[:]是可以的,你的k等于3,那不是翻转完一次没变吗。 楼下老哥的解释很OK:如果不加[:]编译会认为是创建局部变量,[:]是对数组进行操作
4 个月之前 回复
JonathanYan
JonathanYan 回复贵阳老马马善福专业维修游泳池堵漏防水工程: 好的哦
4 个月之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复JonathanYan: 怼完提问的,怼回答的,怼完回答的怼评论的,你注意下情绪哦。
4 个月之前 回复
JonathanYan
JonathanYan 回复请你们大家多多姿瓷我菠菜菌: 还正解,看不出他的代码有什么问题吗。。。
4 个月之前 回复
JonathanYan
JonathanYan 回复贵阳老马马善福专业维修游泳池堵漏防水工程: [:]是没问题的啊。我这边就可以
4 个月之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复JonathanYan: 我知道啊,但是他说nums[:]可以,但是两者都不可以。
4 个月之前 回复
dabocaiqq
请你们大家多多姿瓷我菠菜菌 正解,建议采纳。
4 个月之前 回复
JonathanYan
JonathanYan 老哥,他说的是出错不是报错,这个出错指的就是不会修改数组。。。ok?
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问