美文网首页
《Python 核心技术与实战》 学习笔记 Day14 Pyth

《Python 核心技术与实战》 学习笔记 Day14 Pyth

作者: _相信自己_ | 来源:发表于2023-01-28 12:01 被阅读0次

    '==' VS 'is'

    等于(==)和 is 是 Python 中对象比较常用的两种方式。简单来说,'=='操作符比较对象之间的值是否相等,比如下面的例子,表示比较变量 a 和 b 所指向的值是否相等。

    a == b
    

    而'is'操作符比较的是对象的身份标识是否相等,即它们是否是同一个对象,是否指向同一个内存地址。

    
    a = 10
    b = 10
    
    a == b
    True
    
    id(a)
    4427562448
    
    id(b)
    4427562448
    
    a is b
    True
    

    浅拷贝和深度拷贝

    常见的浅拷贝的方法,是使用数据类型本身的构造器,比如下面两个例子:

    
    l1 = [1, 2, 3]
    l2 = list(l1)
    
    l2
    [1, 2, 3]
    
    l1 == l2
    True
    
    l1 is l2
    False
    
    s1 = set([1, 2, 3])
    s2 = set(s1)
    
    s2
    {1, 2, 3}
    
    s1 == s2
    True
    
    s1 is s2
    False
    

    所谓深度拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。

    
    import copy
    l1 = [[1, 2], (30, 40)]
    l2 = copy.deepcopy(l1)
    l1.append(100)
    l1[0].append(3)
    
    l1
    [[1, 2, 3], (30, 40), 100]
    
    l2 
    [[1, 2], (30, 40)]
    

    总结

    • 比较操作符'=='表示比较对象间的值是否相等,而'is'表示比较对象的标识是否相等,即它们是否指向同一个内存地址。
    • 比较操作符'is'效率优于'==',因为'is'操作符无法被重载,执行'is'操作只是简单的获取对象的 ID,并进行比较;而'=='操作符则会递归地遍历对象的所有值,并逐一比较。
    • 浅拷贝中的元素,是原对象中子对象的引用,因此,如果原对象中的元素是可变的,改变其也会影响拷贝后的对象,存在一定的副作用。
    • 深度拷贝则会递归地拷贝原对象中的每一个子对象,因此拷贝后的对象和原对象互不相关。另外,深度拷贝中会维护一个字典,记录已经拷贝的对象及其 ID,来提高效率并防止无限递归的发生。

    相关文章

      网友评论

          本文标题:《Python 核心技术与实战》 学习笔记 Day14 Pyth

          本文链接:https://www.haomeiwen.com/subject/vzbyhdtx.html