深拷贝、浅拷贝

1.id()

查看变量地址

a = 'asdfasdf'
id(a)

2.'=='和‘is’

 ‘==’是用来判断值相等(值比较)

 ‘is’用来判断变量地址是否相等(引用比较)

 ps:Python是一个彻底的面向对象的语言,Python的变量都是以Object形式存在的。Python似乎有一个类似于Java的对象池,为了追求效率,Java会维护对象池,对整数来说,Java会将128以内(即0到127)的整数存在pool里。若用户要求创建一个128以内的Integer时,JVM不会真去创建一个新的对象, 而是直接从这个pool里将对应整数对象的引用返回。而Python也有类似的机制,但范围不是128以内了。通过测试得出Python的范围是(-5)~(256)(现在我知道了,这个东西叫小整数对象池。。。)

 3.深拷贝、浅拷贝

 1. 浅拷贝

  • 浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容
  • 一般来说,‘=’就是浅拷贝,只是创建了一个指向原来变量地址的引用

2. 深拷贝

  • 深拷贝是对于一个对象所有层次的拷贝(递归)

Python的每个对象都分为可变和不可变,主要的核心类型中,数字、字符串、元组是不可变的,列表、字典是可变的。对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。

  •  python实现深拷贝的方法是copy模块中的deepcopy()方法,实质是递归拷贝所有层次。

 

3. 拷贝的其他方式

  • 浅拷贝还可以使用copy模块的copy()方法
  • copy方法拷贝可变类型时会自动生成一个新的地址,拷贝成被拷贝对象的最外层。例如

  • 分片表达式可以赋值一个序列
    a = "abc"

    b = a[:]
  • 字典的copy方法可以拷贝一个字典
    d = dict(name="zhangsan", age=27)

    co = d.copy()
  • 有些内置函数可以生成拷贝(list)
    a = list(range(10))

    b = list(a)
  • copy模块中的copy函数
    import copy

    a = (1,2,3)

    b = copy.copy(a)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值