copy 模块

1.拷贝(赋值)

1). x为不可变数据类型

x = 10
y = x
print(x,y)
print(id(x),id(y))
x += 1
print(x,y)
print(id(x),id(y))
'''
10 10
1828744960 1828744960
11 10
1828744992 1828744960
'''

​ 结论:y为x的拷贝对象,x为不可变数据类型,x变化y 不变;

2). x为可变数据类型

x = [1,2,3]
y = x
print(x,y)
print(id(x),id(y))
x += [4]
print(x,y)
print(id(x),id(y))
'''
[1, 2, 3] [1, 2, 3]
167373768 167373768
[1, 2, 3, 4] [1, 2, 3, 4]
167373768 167373768
'''

​ 结论:当y为x的拷贝对象,x为可变数据类型,x变化y也变;

3). 可变数据类型(比如列表)内,既有不可变元素,又有容器类型可变元素(比如列表)

# 没添加新元素前
l1 = [1,2,3,[4,5]]
l2=l1
print('id(l1):',id(l1))
print('id(l2):',id(l2))
print(id(l1[0]))
print(id(l1[1]))
print(id(l1[2]))
print(id(l1[3]))
print(id(l1[3][0]))
print(id(l1[3][1]))
print('='*50)
print(id(l2[0]))
print(id(l2[1]))
print(id(l2[2]))
print(id(l2[3]))
print(id(l2[3][0]))
print(id(l2[3][1]))
'''
1843162592
1843162624
1843162656
167373768
1843162688
1843162720
==================================================
1843162592
1843162624
1843162656
167373768
1843162688
1843162720
'''
# 添加新元素后
# l1中添加一个不可变类型元素l1.append(4);在l1[3]中添加一个不可变元素l1[3].append(6);
l1 = [1,2,3,[4,5]]
l2=l1
l1.append(4)
l1[3].append(6) print('id(l1):',id(l1))
print('id(l1[3]):',id(l1[3]))
print('l1:',l1) print('='*50) print('id(l2):',id(l2))
print('id(l2[3]):',id(l2[3]))
print('l2:',l2)
'''
id(l1): 167761224
id(l1[3]): 167718088
l1: [1, 2, 3, [4, 5, 6], 4]
==================================================
id(l2): 167761224
id(l2[3]): 167718088
l2: [1, 2, 3, [4, 5, 6], 4]
'''

​ 结论: 当l2为l1的拷贝对象,l1内部的不可变数据变化,lt2变;l1内部的可变数据变化,l2也变(*****)

2.浅拷贝

# 没添加新元素前
import copy
l1 = [1,2,3,[4,5]]
l2 = copy.copy(l1)
print('id(l1):',id(l1))
print(id(l1[0]))
print(id(l1[1]))
print(id(l1[2]))
print(id(l1[3]))
print(id(l1[3][0]))
print(id(l1[3][1]))
print('='*30)
print('id(l2):',id(l2))
print(id(l2[0]))
print(id(l2[1]))
print(id(l2[2]))
print(id(l2[3]))
print(id(l2[3][0]))
print(id(l2[3][1]))
print('l2:',l2) '''
id(l1): 167761224
1681026528
1681026560
1681026592
id(l1[3]:) 167718088
1681026624
1681026656
==============================
id(l2): 167778760
1681026528
1681026560
1681026592
id(l2[3]:) 167718088
1681026624
1681026656
l2: [1, 2, 3, [4, 5]]
'''
# 添加新元素后
import copy
l1 = [1,2,3,[4,5]]
l2 = copy.copy(l1)
l1.append(4)
l1[3].append(6) print('l1:',l1)
print('id(l1):',id(l1))
print('id(l1[3]):',id(l1[3])) print('='*30)
print('l2:',l2)
print('id(l2):',id(l2))
print('id(l2[3]):',id(l2[3])) '''
l1: [1, 2, 3, [4, 5, 6], 4]
id(l1): 167761224
id(l1[3]): 167718088 # l2为l1的浅拷贝对象,l1中的容器类型的内存地址与l2中的相同。
==============================
l2: [1, 2, 3, [4, 5, 6]]
id(l2): 167778760
id(l2[3]): 167718088
'''

​ 结论:当l2为l1的浅拷贝对象时,l1内部的不可变元素变化,l2不变;l1内部的可变元素变化,l2也变(*********)

3.深拷贝

# 没添加新元素前
import copy l1 = [1,2,3,[4,5]]
l2 = copy.deepcopy(l1) print('id(l1):',id(l1))
print(id(l1[0]))
print(id(l1[1]))
print(id(l1[2]))
print('id(l1[3]:',id(l1[3]))
print(id(l1[3][0]))
print(id(l1[3][1]))
print('='*30)
print('id(l2):',id(l2))
print(id(l2[0]))
print(id(l2[1]))
print(id(l2[2]))
print('id(l2[3]:',id(l2[3]))
print(id(l2[3][0]))
print(id(l2[3][1]))
print('l2:',l2) '''
id(l1): 167761224
2012048864
2012048896
2012048928
id(l1[3]: 167718088
2012048960
2012048992
==============================
id(l2): 167778760
2012048864
2012048896
2012048928
id(l2[3]: 167778376
2012048960
2012048992
l2: [1, 2, 3, [4, 5]]
'''
# l2位l1的深拷贝对象,容器l2和容器l2内部的容器所对应的内存地址与l1都不同,相当于又重新开辟了新的内存空间
# 添加新元素后
import copy
l1 = [1,2,3,[4,5]]
l2 = copy.deepcopy(l1)
l1.append(4)
l1[3].append(6) print('l1:',l1)
print('id(l1):',id(l1))
print('id(l1[3]):',id(l1[3])) print('='*30)
print('l2:',l2)
print('id(l2):',id(l2))
print('id(l2[3]):',id(l2[3])) '''
l1: [1, 2, 3, [4, 5, 6], 4]
id(l1): 167761224
id(l1[3]): 167718088
==============================
l2: [1, 2, 3, [4, 5]]
id(l2): 167778760
id(l2[3]): 167778376
'''
# l1容器内及l1内部容器内添加新元素,l2容器及其内部容器内并没有添加新元素;

​ 结论: 当l2是l1的深拷贝对象时,l1内部的不可变类型变化,l2不变;l1内部的可变类型变化,l2不变(*****)

4.拷贝现象总结及画图解释

![](https://images.cnblogs.com/cnblogs_com/zhangchaocoming/1553249/o_06 深浅拷贝.bmp)

总结:

​ 拷贝:当l2为l1的拷贝对象,l1内部的可变或不可变数据变化,lt2变;(*****)

​ 浅拷贝: 当l2为l1的浅拷贝对象时,l1内部的不可变元素变化,l2不变;l1内部的可变元素变化,l2变(*********)

​ 深拷贝:当l2是l1的深拷贝对象时,l1内部的不可变类型变化,l2不变;l1内部的可变类型变化,lt2不变(*****)

深浅拷贝(copy)的更多相关文章

  1. python基础--深浅拷贝copy

    拷贝是音译的词,其实他是从copy这个英文单词音译过来的,那什么是copy? copy其实就是复制一份,也就是所谓的抄一份.深浅copy其实就是完全复制一份,和部分复制一份的意思. 1.赋值运算 l1 ...

  2. Python_深浅拷贝

    深浅拷贝 ‘copy’和'='的区别:copy会开辟一个新的空间,而‘=’不会. 浅copy只会copy第一层,再里边的就进行共享了. 需要记住的是copy之后记住的是内存寻址地址,而浅copy时如果 ...

  3. @proprety数组字典字符串用copy和strong区别(深浅拷贝)

    ////  @proprety数组字典字符串用copy和strong区别(深浅拷贝).h//  IOS笔记//// /* _proprety________copy_strong_________h ...

  4. 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

    最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...

  5. copy之深浅拷贝

    深浅拷贝深拷贝 全部复制浅拷贝 只复制第一层 __author__ = 'Perfect' # -*- coding: utf-8 -*- import copy # copy.copy() #浅拷贝 ...

  6. 深浅拷贝的应用-copy、mutableCopy

    ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController //如果想让li ...

  7. Python 从零学起(纯基础) 笔记 之 深浅拷贝

    深浅拷贝 1. import  copy#浅拷贝copy.copy()#深拷贝copy.deepcopy()#赋值 = 2.   对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个 ...

  8. python——赋值与深浅拷贝

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  9. Python中的深浅拷贝

    1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...

随机推荐

  1. 03-MySQL多表操作

    一.表之间的关系 1.如何找出两张表之间的关系 分析步骤: #.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是 ...

  2. OpenGL_构建GLFW与第一个程序

    参考教程:https://learnopengl-cn.github.io/ 这个教程已经给出了很详细的资料,当然我这里是对细节的展示(在Windows上). 首先,你需要准备 VS2017 : ht ...

  3. 【VS开发】字符,字节和编码

    字符,字节和编码 [原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/encoding.htm] 级别:中级 摘要:本文介绍了字符与编码的发展过程,相关概念的正确理 ...

  4. mysql——插入、更新、删除数据(概念)

    一.插入数据 1.为表的所有字段插入数据 -------------------------------------------------------------------------- (1)i ...

  5. VS2008编译boost1.53

    1. 准备工作:下载boost_1_53_0.zip(bzip2-1.0.6.tar.gz/icu4c-4_4_2-Win32-msvc9.zip/Python-2.5.2.tar.bz2/zlib- ...

  6. Python学习教程:Pandas中第二好用的函数

    从网上看到一篇好的文章是关于如何学习python数据分析的迫不及待想要分享给大家,大家也可以点链接看原博客.希望对大家的学习有帮助. 本次的Python学习教程是关于Python数据分析实战基础相关内 ...

  7. python模块hashlib & hmac

    Hash,译做“散列”,也有直接音译为“哈希”的.把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值.该算法就是哈希函数,也称摘要函数. MD5是最常见的摘要算 ...

  8. python线程的几种创建方式

    Python3 线程中常用的两个模块为: _thread threading(推荐使用) 使用Thread类创建 import threading from time import sleep,cti ...

  9. jQuery俄罗斯方块游戏动画

    在线演示       本地下载

  10. Spring Boot全局支持CORS(跨源请求)

    import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet. ...