良木 发表于 2022-4-14 00:06:54

python语句含义及结果原因求助

做题时碰到一个疑问,我的列表是在函数外面,但是题目要求在原来列表上翻转k位,不要创建新的列表,然后我就看到这个用法
nums[:] = nums + nums[:len(nums) - k]
这个语句为什么可以直接改变在函数外面的列表的值?这不是浅拷贝吗,我打印了id(nums[:] )和id(nums)不一样啊


class Solution:
    def rotate(self, nums,k) -> None:
      nums[:] = nums + nums[:len(nums) - k]
      print(nums)


if __name__ == '__main__':
    c = Solution()
    nums =
    c.rotate(nums,3)
    print(nums)

hrpzcf 发表于 2022-4-14 00:21:32

nums[:]出现在等号左边时它是通过列表的__setitem__方法实现的,此方法内是对列表实例进行修改。出在在等号右边或者取值的时候是通过__getitem__方法实现的,他返回的是列表实例的浅拷贝。

isdkz 发表于 2022-4-14 00:28:35

它既可以用来拷贝也可以用来赋值,就跟 一个道理

test =
a = test               # 可以用 test 来取出 test 列表的元素
test = 6               # 也可以通过 test 来改变 test 列表的元素

良木 发表于 2022-4-14 09:42:53

hrpzcf 发表于 2022-4-14 00:21
nums[:]出现在等号左边时它是通过列表的__setitem__方法实现的,此方法内是对列表实例进行修改。出在在等号 ...

这个是哪个知识点啊?没学到{:5_106:}

hrpzcf 发表于 2022-4-14 11:14:07

良木 发表于 2022-4-14 09:42
这个是哪个知识点啊?没学到

小甲鱼教程好像没讲这个(记不清了)
我上面的回答有点问题,应该概括为nums[]的赋值和取值是通过不同的魔法方法实现的,所以出现了你的疑问中的不同。
你可以百度了解一下它们用法,x[]类型的赋值、取值和__setitem__、__getitem__有关,比如x、x、x["a"]等。
页: [1]
查看完整版本: python语句含义及结果原因求助