模块之copy的功能介绍

copy主要分两种:

1.浅拷贝
2.深拷贝

赋值:

在python中赋值算特殊的拷贝,其实赋值可以理解为同一个对象有两个名字,所以当其中一个发生变化,另一个也跟着会变化。

1.浅拷贝

  1. 创建

    格式:copy.copy(x)
    例如:n1 = 123
    print(copy.copy(n1))
    >>> 123
    返回值:obj
    #对于浅拷贝可以调用copy模块,当然也可以直接使用copy函数来执行,实际中直接使用copy函数比较常见。
  2. int拷贝

    例如:n1 = 123
    n2 = copy.copy(n1)
    print(id(n1))
    print(id(n1))
    >>> 1356861712
    >>> 1356861712
    #对于数值类型的拷贝,拷贝前后id一样,说明该拷贝的内存地址是一样的。
  3. str拷贝

    例如:n1 = 'abc'
    n2 = copy.copy(n1)
    print(id(n1))
    print(id(n1))
    >>> 16618528
    >>> 16618528
    #对于字符串类型的拷贝,拷贝前后id一样,说明该拷贝的内存地址是一样的。
  4. list拷贝

    例如:n1 = [1,2,'a','b',]
    n2 = copy.copy(n1)
    print(id(n1))
    print(id(n2))
    >>> 18118472
    >>> 27291208
    print(id(n1[1]))
    print(id(n2[1]))
    >>> 1356857840
    >>> 1356857840
    #该拷贝说明两个列表指向的内存地址并不是一样的,单元素指向的内存地址仍然是一样的。
    例如:n1 = [1,2,'a','b',[1,3,5]]
    n2 = copy.copy(n1)
    print(id(n1[-1]))
    print(id(n2[-1]))
    >>> 27291400
    >>> 27291400
    #拷贝前后列表元素中的列表指向内存地址是一样的。说明拷贝列表的时候,元素中如果是列表,则列表不进行拷贝,直接引用拷贝前列表中的内存地址。
    例如:n1 = [1,2,'a','b',[1,3,5],(2,4,6)]
    n2 = copy.copy(n1)
    print(id(n1[-1]))
    print(id(n2[-1]))
    >>> 26827872
    >>> 26827872
    #对于浅拷贝,当列表中的元素为列表或者元祖等对象时,都是直接引用拷贝前该对象的内存地址。
  5. tuple拷贝

    例如:n1 = (1,2,'a','b',)
    n2 = copy.copy(n1)
    print(id(n1))
    print(id(n2))
    >>> 26736424
    >>> 26736424
    #拷贝前后两个元祖的内存地址是一样,说明拷贝元祖时,是直接引用拷贝前元祖的内存地址。
    例如:n1 = (1,2,'a','b',(1,3,5))
    n2 = copy.copy(n1)
    print(id(n1[-1]))
    print(id(n2[-1]))
    >>> 26827872
    >>> 26827872
    #当有元祖的元素为元祖时,在拷贝时,也是直接引用拷贝前元祖中元素的内存地址。
  6. dict拷贝

    例如:n1 = {'k1':'v1','k2':'v2'}
    n2 = copy.copy(n1)
    print(id(n1))
    print(id(n2))
    >>> 16773512
    >>> 19730504
    #拷贝字典时,拷贝前后的内存地址不一样,说明字典的拷贝并不是直接引用拷贝前的内存地址。
    例如:n1 = {'k1':'v1','k2':'v2','k3':{'kx1':'vx1','kx2':'vx2'}}
    n2 = copy.copy(n1)
    print(id(n1['k3']))
    print(id(n2['k3']))
    >>> 19730504
    >>> 19730504
    #当字典中的key对于的value为字典时,进行浅拷贝时,直接引用其拷贝前的内存地址。
  7. set拷贝

    例如:n1 = {1,2,'a','b'}
    n2 = copy.copy(n1)
    print(id(n1))
    print(id(n2))
    >>> 18151016
    >>> 18150792
    #集合的浅拷贝,拷贝前后的内存地址并不是一样的。
  8. collections.Counter拷贝

    由于字典计数器是对字典的扩展,而且返回值仍是一个字典,因此该对象的浅拷贝,参考字典的浅拷贝即可。
  9. collections.OrderedDict拷贝

    由于有序字典也是对字典的扩展,但该返回值为列表,因此该对象的浅拷贝,参考列表浅拷贝的第三种例子即可。
  10. collections.defaultdict拷贝

    由于默认字典也是对字典的扩展,而且返回值属于字典类型,因此该对象的浅拷贝,参考字典的浅拷贝即可。
  11. collections.namedtuple拷贝

    由于可命名元祖是对元祖的扩展,但返回值属于元祖类型,因此该对象的浅拷贝,参考元祖的浅拷贝即可。
  12. collections.deque拷贝

    由于双向队列返回值属于列表类型,因此该对象的浅拷贝,参考列表的浅拷贝即可。

2.深拷贝

  1. 创建

    格式:copy.deepcopy(x,memo=None)
    例如:n1 = 123
    print(copy.deepcopy(n1))
    >>> 123
    返回值:obj
    #深拷贝的创建只能调用copy模块来执行。
  2. int拷贝

    例如:n1 = 123
    n2 = copy.deepcopy(n1)
    print(id(n1))
    print(id(n2))
    >>> 1356861712
    >>> 1356861712
    #对于数值类型的拷贝,拷贝前后id一样,说明该拷贝的内存地址是一样的。
  3. str拷贝

    例如:n1 = 'abc'
    n2 = copy.deepcopy(n1)
    print(id(n1))
    print(id(n1))
    >>> 16618528
    >>> 16618528
    #对于字符串类型的拷贝,拷贝前后id一样,说明该拷贝的内存地址是一样的。
  4. list拷贝

    例如:n1 = [1,2,'a','b',]
    n2 = copy.deepcopy(n1)
    print(id(n1))
    print(id(n2))
    >>> 27291336
    >>> 27276808
    print(id(n1[1]))
    print(id(n2[1]))
    >>> 1356857840
    >>> 1356857840
    #该拷贝说明两个列表指向的内存地址并不是一样的,单元素指向的内存地址仍然是一样的。
    例如:n1 = [1,2,'a','b',[1,3,5]]
    n2 = copy.deepcopy(n1)
    print(id(n1[-1]))
    print(id(n2[-1]))
    >>> 27291464
    >>> 27291272
    #拷贝前后列表元素中的列表指向内存地址也是不一样的。说明拷贝列表的时候,元素中如果是列表,则列表也进行拷贝,不再引用拷贝前列表中的内存地址。
    例如:n1 = [1,2,'a','b',[1,3,5],(2,4,6)]
    n2 = copy.deepcopy(n1)
    print(id(n1[-1]))
    print(id(n2[-1]))
    >>> 26827872
    >>> 26827872
    #对于深拷贝,拷贝对象为元祖时,都是直接引用拷贝前的内存地址。
  5. tuple拷贝

    例如:n1 = (1,2,'a','b',)
    n2 = copy.deepcopy(n1)
    print(id(n1))
    print(id(n2))
    >>> 26736424
    >>> 26736424
    #拷贝前后两个元祖的内存地址是一样,说明拷贝元祖时,是直接引用拷贝前元祖的内存地址。
    例如:n1 = (1,2,'a','b',(1,3,5))
    n2 = copy.deepcopy(n1)
    print(id(n1[-1]))
    print(id(n2[-1]))
    >>> 26827872
    >>> 26827872
    #当有元祖的元素为元祖时,在拷贝时,也是直接引用拷贝前元祖中元素的内存地址。

    注:由于在python中数值、字符串和元祖,属于不可改变的对象,因此在深浅拷贝中,都是直接引用拷贝前的内存地址,并非重新开辟一块内存地址。

  6. dict拷贝

    例如:n1 = {'k1':'v1','k2':'v2'}
    n2 = copy.deepcopy(n1)
    print(id(n1))
    print(id(n2))
    >>> 16773512
    >>> 27253512
    #拷贝字典时,拷贝前后的内存地址不一样,说明字典的拷贝并不是直接引用拷贝前的内存地址。
    例如:n1 = {'k1':'v1','k2':'v2','k3':{'kx1':'vx1','kx2':'vx2'}}
    n2 = copy.deepcopy(n1)
    print(id(n1['k3']))
    print(id(n2['k3']))
    >>> 19730504
    >>> 26819016
    #深拷贝中,当字典中key对应的value为字典时,进行拷贝时,并不是直接引用其拷贝前的内存地址。
  7. set拷贝

    例如:n1 = {1,2,'a','b'}
    n2 = copy.deepcopy(n1)
    print(id(n1))
    print(id(n2))
    >>> 18151016
    >>> 27225672
    #集合的深拷贝,拷贝前后的内存地址并不是一样的。

    注:由于集合中不能包含集合,这里不再多举例说明。

  8. collections.Counter拷贝

    由于字典计数器是对字典的扩展,而且返回值仍是一个字典,因此该对象的深拷贝,参考字典的深拷贝即可。
  9. collections.OrderedDict拷贝

    由于有序字典也是对字典的扩展,但该返回值为列表,因此该对象的深拷贝,参考列表浅拷贝的第三种例子即可。
  10. collections.defaultdict拷贝

    由于默认字典也是对字典的扩展,而且返回值属于字典类型,因此该对象的深拷贝,参考字典的深拷贝即可。
  11. collections.namedtuple拷贝

    由于可命名元祖是对元祖的扩展,但返回值属于元祖类型,因此该对象的深拷贝,参考元祖的深拷贝即可。
  12. collections.deque拷贝

    由于双向队列返回值属于列表类型,因此该对象的深拷贝,参考列表的深拷贝即可。

注:由于queue模块中的Queue单项队列没有copy功能,因此这里不作介绍。

Python中模块之copy的功能介绍的更多相关文章

  1. Python中模块之os的功能介绍

    Python中模块之os的功能介绍 1. os的变量 path 模块路径 方法:os.path 返回值:module 例如:print(os.path) >>> <module ...

  2. Python中模块之queue的功能介绍

    模块之queue的功能介绍 队列的分类: 队列主要要分为两种 1.双向队列 2.单项队列 1. 单项队列 创建单项队列 格式:queue.Queue(obj) 例如:que = queue.Queue ...

  3. Python中模块之sys的功能介绍

    sys模块的功能介绍 1. sys的变量 argv 命令行参数 方法:sys.argv 返回值:list 例如:test1.py文件中有两句语句1.import sys 2.print(sys.arg ...

  4. Python中模块之re的功能介绍

    re模块的功能介绍 1. 方法 match 从开头开始查找 方法:re.match(pattern,string,flags=0) 返回值:<class '_sre.SRE_Match'> ...

  5. Python中模块之random的功能介绍

    random的功能介绍 random模块的方法如下: betavariate 获取一个range(0,1)之前的随机浮点数 方法:random.betavariate(alpha,beta) 返回值: ...

  6. Python中生成器和迭代器的功能介绍

    生成器和迭代器的功能介绍 1. 生成器(generator) 1. 赋值生成器 1. 创建 方法:x = (variable for variable in iterable) 例如:x = (i f ...

  7. Python中def及lambda的功能介绍

    函数def及lambda的功能介绍 1. def函数的功能介绍 1. 函数的参数 无参数函数 格式:def func_name(): '''__doc__'''#函数的说明文档(内容) express ...

  8. 查看python中模块的所有方法

    查看python中模块的所有方法     安装的python模块,现将查看方法总结如下 一.CMD命令行下使用pydoc命令 在命令行下运行$ pydoc modules即可查看 二.在python交 ...

  9. [python]关于在python中模块导入问题追加总结

    [背景] 最近在写程序时,我使用的eclipse编辑器运行都没有问题,然后部署到自动化环境上却偏偏报找不到相应模块问题,现在对该问题在之前的贴子上追加总结 原帖子:[python]关于python中模 ...

随机推荐

  1. php函数var_dump() 、print_r()、echo()

    var_dump() 能打印出类型 print_r() 只能打出值 echo() 是正常输出... 需要精确调试的时候用 var_dump(); 一般查看的时候用 print_r() 另外 , ech ...

  2. Python之旅.第四章.模块与包.总结(未完待遇)

    一.模块 模块: 一系列功能的集合体,在python中一个py文件就是一个模块,模块名就是py文件的文件名: 模块的好处: 1.减少重复的代码 2.拿来主义 定义模块: 就是创建一个py文件: 使用模 ...

  3. LeetCode & Q167-Two Sum II - Input array is sorted-Easy

    Array Two Pointers Binary Search Description: Given an array of integers that is already sorted in a ...

  4. Linux CentOS7.0 (01)在Vmvare Workstation上 安装配置

    一.新建虚拟机 1.创建新的虚拟机 -> 默认典型 ->选择安装介质 2.指定虚拟机名称.安装目录.磁盘容量大小 点击 "完成",创建虚拟机! 随后虚拟机将自动启动安装 ...

  5. 新概念英语(1-123)A trip to Australia

    Who is the man with the beard?(胡须)A:Look, Scott. This is a photograph I took during my trip to Austr ...

  6. 英语词汇(5)followed by / sung by / written by

    Sung by 演唱者; [例句]In the recording I have today, it is sung by a male alto.我今天带的唱片是由一位男高音歌手唱的. follow ...

  7. iOS HTML图片本地预览

    引言 相信用过苹果手机的童鞋,会发现很多新闻类的应用,都可以实现HTML图片本地预览,那么这是如何实现的呢?本文将深入阐述其中的原理. 关于此功能,我还实现了一个DEMO,大家可以点击此访问更详细内容 ...

  8. 复习上学期的HTML+CSS(1)

    自己跟着网上教程复习上学期的HTML+CSS,因为已经忘得差不多了,而且现在学的js也要以HTML+CSS为基础,坚持每天持续更新. n  B/S 网络结构   Browser/Server 浏览器/ ...

  9. javascript 作用域链与执行环境

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 作用域.作用域链.执行环境.执行环境栈以及this的概念在javascript中非常重要,本人经常弄混淆, ...

  10. SQL语句 (一)

    1 SQL语句分类: 数据查询语句(DQL): SELECT 数据操纵语言 (DML): INSERT.UPDATE.DELETE 数据定义语言 (DDL): 数据控制语言 (DCL): GRANT. ...