zoukankan      html  css  js  c++  java
  • python基础之赋值/深copy/浅copy

    首先,不管是赋值还是深浅copy,都是针对那些可能会产生变化的值进行区分的,也就是对于数字,字符串来说,区分赋值,深浅copy是毫无意义的。

    那么,让我们来对那些可变的像list set dict tuple……来进行探讨。

    赋值:

      有两种修改n的方法:

      1  直接对n赋值

    >>> n=[1,2]
    >>> g=n
    >>> id(n)
    140529062430792
    >>> id(g)
    140529062430792
    >>> n=[1,3]
    >>> g
    [1, 2]
    >>> id(n)
    140529062430920
    >>> id(g)
    140529062430792

      2  对n的某个元素进行赋值

    >>> n=[1,2]
    >>> g=n
    >>> id(n)
    140529062430728
    >>> id(g)
    140529062430728
    >>> n[1]=3
    >>> g
    [1, 3]
    >>> id(n)
    140529062430728
    >>> id(g)
    140529062430728

    浅copy

    >>> import copy
    >>> name=['tong','yang']
    >>> n=[1,name]
    >>> g=copy.copy(n)
    >>> g
    [1, ['tong', 'yang']]
    >>> id(n)
    140529062259976
    >>> id(g)
    140529062259848 #两个变量(n和g)的地址不相同

      当修改n的name的元素时:

    >>> name[1]='hua'
    >>> n
    [1, ['tong', 'hua']]
    >>> g
    [1, ['tong', 'hua']]
    >>> id(n)
    140529062259976
    >>> id(g)
    140529062259848
    #n和g的值相同,并且内存地址都没有改变

      浅copy只会copy一层,所以在上例中n和g的值都改变了

    深copy

    >>> name=['tong','yang']
    >>> n=[1,name]
    >>> g=copy.deepcopy(n)
    >>> g
    [1, ['tong', 'yang']]   #g的第二个元素已经不是变量name了。
    >>> id(n)
    140529062430728
    >>> id(g)
    140529062259976
    #n与g的地址不同

      当修改name的元素时:

    >>> name[1]='hua'
    >>> n
    [1, ['tong', 'hua']]
    >>> g
    [1, ['tong', 'yang']]
    #n的值变了,但g的值没有变。深copy会copy所有层

      深copy则会copy所有层,并且会将其中的变量的值直接输出取代变量。

    本文参考了:http://www.cnblogs.com/wupeiqi/articles/5133343.html

    no copyright !! 个人原创博客欢迎转载,可以不保留出处。
  • 相关阅读:
    C#:如何设置MDI窗体
    asp.net在类库中使用EF 6.0时的相关配置
    asp.net中使用jquery ajax保存富文本的问题
    Asp.net Api中使用OAuth2.0实现“客户端验证”
    NLog在asp.net中的使用
    元素的隐藏特性
    jQuery 使用笔记
    获取标签的所有选择器存放在一个数组
    自己绘制的flex布局思维导图
    js打印三角形
  • 原文地址:https://www.cnblogs.com/MnCu8261/p/5459605.html
Copyright © 2011-2022 走看看