理解列表的引用和浅拷贝,体会path和path[:]的不同

零、从哪里来

引用与浅拷贝与深拷贝

记得看这篇文章总结最后,不亏,没看完的话,你会后悔一辈子。

一、先看算法题(回溯法)

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集。

解集不能包含重复的子集。返回的解集中,子集可以按任意顺序排列。

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        results = []
        nums.sort() # 去重必须有排序
        self.backtracking(nums, 0,[],results)
        return results
    
    def backtracking(self,nums, startIndex, path, results):
        results.append(path[:])
        for i in range(startIndex, len(nums)):
            if i >startIndex and nums[i] == nums[i-1]:
                continue
            path.append(nums[i])
            self.backtracking(nums, i+1, path, results)
            path.pop()

上面算法题,如果使用path,而不是path[:],这道题就达不到预期了,更详细的对比应该看开头的博客文章。
这里留个快截图,也可以直接从这里了解。
在这里插入图片描述

二、扩展

is操作符用于比较两个对象的身份,即它们是否是同一个对象。在Python中,is实际上是比较两个对象的id()值是否相同。

大多数情况下,id(obj1) == id(obj2)和obj1 is obj2是等价的,因为它们都在检查两个对象是否具有相同的内存地址。然而,存在一些特殊情况,比如Python的整数缓存机制,在这种情况下,is可能会给出不同的结果。Python会缓存一些小范围的整数,因此两个不同的变量可能引用内存中的同一个整数对象。

三、总结

大多数情况下,id(obj1) == id(obj2)和obj1 is obj2是等价的。然而,存在一些特殊情况,比如Python的整数缓存机制,在这种情况下,is可能会给出不同的结果。Python会缓存一些小范围的整数,因此两个不同的变量可能引用内存中的同一个整数对象。

看程序结果就(想打 行 字,发现“醒”这个字更加有魅力)了:

>>> a = 1
>>> b = 1
>>> id(a)
2277095401776
>>> id(b)
2277095401776
>>> a is b
True
>>> s = 2566
>>> x = 2566
>>> id(s)
2277132164080
>>> id(x)
2277132164272
>>> s is x
False
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值