zoukankan      html  css  js  c++  java
  • python 深浅拷贝 进阶

    主要理解新与旧究竟在哪里 这样也就理解了 深浅拷贝

    先说说赋值,事实上python中的赋值事实上是赋值了一个引用。比如:

    foo1=1.0

    foo2=foo1

    用操作符is推断时。你能够发现结果是true。是由于python是先创建了一个对象1.0,然后这个对象的引用又被赋值给了foo1和foo2,可是假设是这样:

    foo1=1.0

    foo2=1.0

    这时你会发现。这事实上是创建了两个不同的对象。用内建函数id()能够发现,二者的身份不同。

    事实上python另一个特例,比如:

    a=1

    b=1

    你会发现id(a)=id(b),原因是python觉得这些小整型是会经经常使用到的,所以python会缓存一部分小整型。

    其次再说说浅拷贝和深拷贝。

    序列类型的能够通过三种方式实现浅拷贝,浅拷贝也是默认的拷贝类型:(1)全然切片操作;(2)利用工厂函数。比方list()等;(3)使用copy模块中的copy()函数。然而对于非容器类型没有拷贝这这一说。在《python核心编程》一书中说道,“对一个对象进行浅拷贝事实上是新创建了一个类型跟原对象一样。其内容是原来对象元素的引用,换句话说。这个拷贝的对象本身是新的。可是它的内容不是”读完这句话我的理解是浅拷贝事实上是赋值,但后来发现不然,由于赋值的结果是他们的身份同样。可是浅拷贝的身份却不同,以下我结合书上的样例以及我自己的想法来说明这句话是什么意思。

    fanwei@ubuntu:~$ python

    Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 

    [GCC 4.4.3] on linux2

    Type "help", "copyright", "credits" or "license" for more information.

    >>> person=['name',['saveing',100]]

    >>> wife=person[:]

    >>> hubb=list(person)

    >>> id(person)

    3078619916L

    >>> id(wife)

    3078621548L

    >>> id(hubb)

    3078621996L

    从代码的结果能够看出hubb和wife尽管是person浅拷贝的结果可是他们身份却不同。再看看他们的内容
    >>>[id(x) for x in hubby]
    [3078622112L,3078534412L]
    >>>[id(x) for x in wife]
    [3078622112L,3078534412L]

    二者内容的身份却是一样的。

     
    从这一点能够看出所谓的“拷贝对象本身是新的“就是之前代码验证的person、hubb和wife的身份不同。”内容是旧的“就是我们刚刚验证的,所以说事实上内容的浅拷贝能够看做是”赋值“。你会发现,假设我们将hubb中的’100‘改成’50‘,wife中的’100‘也变成了’50‘这就说明事实上内容的浅拷贝就是”赋值“即两个引用指向同一个对象,改变后二者的身份还是同样。

     
    此外,因为hubb[0]、wife[0]是字符串,所以他们没有拷贝一说。是创建了一个新的类型。所以当把二者中的’name‘改名后,他们的身份就不同了。对于深拷贝无论是对象和内容身份都是不同的。这点就不再多说了。

     
    如今。应该明确所谓的”对象本身是新的。内容是旧的“这句话的真正含义了吧。
  • 相关阅读:
    2019.10.31 答辩回来后;
    2019.10.22
    2019.10.21 上周总结+今天
    2019.10.20 没有人可以阻挡自己努力,男朋友也不可以。少情感,多学习;;多夸夸他肯定他
    2019.10.19 干什么? 不要纠结了于下手什么了 趁还年轻 去做吧!!
    2019.10.16 每天问自己 三遍 或者更多:我收获了什么?我收获了什么?我收获了什么???
    Java 错误:Constructor call must be the first statement in a constructor
    2019.10.14 解决讨好型人格;时间管理划分等级+设定时间上限
    2019.10.14 今天看到的业务大佬的肺腑之言
    放几张吴悠校园行
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7086828.html
Copyright © 2011-2022 走看看