1.python中深拷贝和浅拷贝的理解

  自己理解:浅拷贝,只是拷贝引用,不开辟新的空间存储拷贝内容。

       深拷贝,就是在内存中,开辟一个新的内存地址,将拷贝内容放到新的地址中去。

  验证:对于数字,字符串,元祖这种不可变类型的数据,深拷贝和浅拷贝拷贝的是内存地址的引用。

  不可变类型

import copy


# 不可变类型---数值 int float
a1 = 1
b1 = copy.copy(a1)
print(id(a1))  # 8791199896608
print(id(b1))  # 8791199896608
c1 = copy.deepcopy(a1)
print(id(c1))  # 8791199896608
d1 = a1
print(id(d1))  # 8791199896608


# 不可变类型---元祖
a2 = (1,2)
b2 = copy.copy(a2)
print(id(a2)) # 35120520
print(id(b2)) # 35120520
c2 = copy.deepcopy(a2)
print(id(c2)) # 35120520
d2 = a2
print(id(d2)) # 35120520


# 不可变类型---字符串
a3 = "china"
b3 = copy.copy(a3)
print(id(a3)) # 43407152
print(id(b3)) # 43407152
c3 = copy.deepcopy(a3)
print(id(c3)) # 43407152
d3 = a3
print(id(d3)) # 43407152

  可变类型:字典,列表

a1 = [1,2,3]
b1 = copy.copy(a1)
print(id(a1)) # 43298888  
print(id(b1)) # 43270024
c1 = copy.deepcopy(a1)
print(id(c1)) # 43299144
d1 = a1
print(id(d1)) # 43298888

 图像理解浅拷贝:浅拷贝是在内存中创建了一个新的内存地址,用来存放新的列表,b指向这个列表,所以a和b在内存中的地址不一样。因此说浅拷贝只是拷贝了列表这个对象,而不是里面的数据。

 

  如何证明,浅拷贝只是拷贝了对象,而不是里面的内容呢?

a1 = [1,2,3]
b1 = copy.copy(a1)
print(id(a1)) #
print(id(b1)) #
for i in a1:
print(id(i)) 8791195833376
8791195833408
8791195833440 for i in b1:
print(id(i)) 8791195833376
8791195833408
8791195833440

  所以打印a1和b1的内存地址不同,但是结果却相同。

print(a1)
print(b1)
[1, 2, 3]
[1, 2, 3]

  另一种方式证明,浅拷贝只是拷贝对象,而里面的数据还是指向原来对象的数据。

import copy

a1 = [1,2,3,[4,5,6]]
b1 = copy.copy(a1)
print(a1)
print(b1) [1, 2, 3, [4, 5, 6]]
[1, 2, 3, [4, 5, 6]] a1[3].append(4) # 也就是说b1里面下标为3的元素是指向a1里面下标为3的元素,所以才会打印出一样的效果。
print(a1)
print(b1) [1, 2, 3, [4, 5, 6, 4]]
[1, 2, 3, [4, 5, 6, 4]]

  下面的例子也直接能证明这一点

import copy

a1 = [1,2,3]
b1 = copy.copy(a1)
print(a1)
print(b1) [1, 2, 3]
[1, 2, 3] a1.append(4) # 此时a1中有四个元素,此时b1中只有三个元素,b1中没有第四个元素指向a1中新的元素,所以打印结果如下。
print(a1)
print(b1) [1, 2, 3, 4]
[1, 2, 3]

  python中产生浅拷贝效果的地方:

    1.列表的切片

a = [1,2,3,4,5,7,8,9,10]
b = a[1:5]
print(a)
print(b) [1, 2, 3, 4, 5, 7, 8, 9, 10]
[2, 3, 4, 5] a[1] = "" # a 中下标为1的元素新建立了一个内存地址,存储的是"1"
a[2] = ""
a[3] = ""
a[4] = ""
print(a)
print(b) # b 中下标为1的元素指向的是原来这个数据1在内存中的地址。 [1, '', '', '', '', 7, 8, 9, 10]
[2, 3, 4, 5]

    2. 使用copy模块中的copy()函数

 图像理解浅拷贝:

import copy
a = [1,2,3,[4,5,6]] # 对于不可变类型,深拷贝也只是拷贝引用,但是对于可变类型[4,5,6],深拷贝会拷贝一个新的对象,多以id值不一样,那么当[4,5,6]的数据进行增加时,深拷贝的后的对象会发生变化吗?
b = copy.deepcopy(a)
print(id(a))
print(id(b)) 43138824
43167944 for i in a:
print(id(i)) 8791199896608
8791199896640
8791199896672
43138952 for i in b:
print(id(i)) 8791199896608
8791199896640
8791199896672
43204232
import copy
a = [1,2,3,[4,5,6]]
b = copy.deepcopy(a) print(a)
print(b) [1, 2, 3, [4, 5, 6]]
[1, 2, 3, [4, 5, 6]]
# 当a[3]中的元素进行增加数量时,因为深拷贝后列表中的第三个元素指向发生了变化,重新生成了一个列表,指向了新列表,所以,原列表增加,新列表不增加。但是列表中的元素,还是指向原来列表中的元素。
a[3].append(7) 

print(a)
print(b) [1, 2, 3, [4, 5, 6, 7]]
[1, 2, 3, [4, 5, 6]] for i in a[3]:
print(id(i)) 8791199896704
8791199896736
8791199896768
8791199896800 for i in b[3]:
print(id(i)) 8791199896704
8791199896736
8791199896768

# TODO 字典

# TODO 元祖

总结:

  • Python中对象的赋值都是进行对象引用(内存地址)传递
  • 使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
  • 如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
  • 对于非容器类型(如数字、字符串、和其他'原子'类型的对象)没有被拷贝一说
  • 如果元祖变量只包含原子类型对象,则不能深拷贝

python基础面试题总结的更多相关文章

  1. python基础面试题整理---从零开始 每天十题(01)

    最近在弄flask的东西,好久没写博客的,感觉少了点什么,感觉被别人落下好多,可能渐渐的养成了写博客的习惯吧.也是自己想学的东西太多了(说白了就是基础太差了,只是know how,不能做到konw w ...

  2. Python基础面试题库

    Python基础面试题库   Python是一门学习曲线较为容易的编程语言,随着人工智能时代的到来,Python迎来了新一轮的高潮.目前,国内知乎.网易(游戏).腾讯(某些网站).搜狐(邮箱).金山. ...

  3. python基础面试题整理---从零开始 每天十题(02)

    书接上回,我们继续来说说python的面试题,我在各个网站搜集了一些,我给予你们一个推荐的答案,你们可以组织成自己的语言来说出来,让我们更好的做到面向工资编程 一.Q:说说你对zen of pytho ...

  4. python基础面试题(全网最全!)

    目录 1.为什么学习Python? 2.通过什么途径学习的Python? 3.Python和Java.PHP.C.C#.C++等其他语言的对比? 4.简述解释型和编译型编程语言? 5.Python解释 ...

  5. python基础面试题30问(附带答案)

    1.     闭包 定义:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个参数a, 内层函数依旧传入一个参数b, 内层函数使用a和b, 最后 ...

  6. Python基础面试题整理

    基础 Python中lambda是什么意思 Python中的pass是什么意思 作为解释型语言,Python如何运行 什么是Python的单元测试 在Python中unittest是什么 如何将数字转 ...

  7. python基础面试题1

    Python面试重点(基础篇) 注意:只有必答题部分计算分值,补充题不计算分值. 第一部分 必答题(每题2分) 简述列举了解的编程语言及语言间的区别? c语言是编译型语言,运行速度快,但翻译时间长py ...

  8. python基础面试题(一)

    1.   简述Python代码的运行机制 1.把原始代码编译成字节码         编译后的字节码是特定于Python的一种表现形式,它不是二进制的机器码,需要进一步编译才能被机器执行. 2.把编译 ...

  9. python基础面试题整理---从零开始 每天十题(04)

    一.Q:如何用Python来进行查询和替换一个文本字符串? A:可以使用sub()方法来进行查询和替换,sub方法的格式为:sub(replacement, string[, count=0]) re ...

  10. python基础面试题整理---从零开始 每天十题(03)

    一.Q:用Python输出一个Fibonacci数列?(斐波那契额数列) A:我们先来看下代码 #!/usr/bin/env python # -*- coding: utf-8 -*- def fi ...

随机推荐

  1. Codeforces 830A. Office Keys (贪心二分 or DP)

    原题链接:http://codeforces.com/contest/830/problem/A 题意:在一条数轴上分别有n个人和k把钥匙(n<=k),以及一个目的地,每个人要各自拿到一个钥匙后 ...

  2. 【CF1243A】Maximum Square【贪心】

    题意:给你n个长度为ai的木板,求最大能拼成的矩形为多大 题解:显然贪心每次选最大的进去拼,那么剧需要枚举矩形长度x,看最长的k个能够拼出长度为x的矩形即可 #include<iostream& ...

  3. Linux CentOS7 安装docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口 ...

  4. CTF_工具网址收藏

    杂项 条形码在线扫描 :    https://online-barcode-reader.inliteresearch.com/ PS弄反色ctr+i    :  https://zhidao.ba ...

  5. applicationContext.xml无错有红叉,Error occured processing XML 'Provider org.apache.xerces.parsers.解决方案

    applicationContext.xml无错有红叉,网上讲的取消xml验证的方法没用... 甚至我的myeclipse10连windows-->perferences-->myecli ...

  6. mariadb(一)基础

    一.数据库介绍 1.什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来 ...

  7. 关于Vue+iview的前端简单的导入数据(excel)

    前一段时间项目经历了纯前端处理导入excel文件并处理等问题,数据量大的时候时间上长的一比,三千条数据需要三四秒甚至更长,不管产品咋想的,具体做法为: 首先下载一个这玩意: 进行简单封装一下: < ...

  8. 鸿蒙系统开源学习经验分享HarmonyOS[www.allharmonyos.com]

    分享鸿蒙系统开源知识,分享学习经验,分享鸿蒙系统开发经验 www.allharmonyos.com https://gitee.com/allharmonyos https://github.com/ ...

  9. 性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控

    一.安装配置InfluxDB InfluxDB是GO语言开发的一个开源分布式时序数据库,非常适合存储指标.事件.分析等数据.有人做过mysql和influxDB对比,存储1000万条数据mysql要7 ...

  10. 【ABAP系列】SAP ABAP模块-ABAP动态指针写法的精髓部分

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP模块-ABAP动 ...