Python学习之路(四):基础知识之深浅拷贝

1.is和==的区别

== 比较左右两边的值,如果相同,打印的是True,如果不同,打印的是False

1 n = 10
2 n1 = 12
3 print(n == n1) #False

is比较的是内存地址

1 a = ‘dhj‘
2 b = ‘dhj‘
3 print(a is b) # True
1 a = ‘a‘*21
2 b = ‘a‘*21
3 print(a is b) #false

为什么第二个程序中的结果会是False呢,这涉及到一个小数据池的概念:

  • 小数据池只限制于数值和字符串,数值的范围:-5至256
  • 字符串中如果有特殊字符如+ - * 等,他们的内存地址就会不一样
  • 字符串单个乘以20以内的话,内存地址是一样的
  • 以上限于cmd终端中,在PYcharm中不一定适用

2.深拷贝

  1. 首先,就深浅拷贝而言,对于str/bool/int这三种数据类型而言是没有区别的,都是在内存中新开辟一块地址去存储。
  2. 深浅拷贝对于list/set/dic三种数据类型而言有区别,当这三种数据类型内部没有嵌套可变数据类型时,深浅拷贝区别不大。
  3. 而当存在嵌套的情况时,浅拷贝只是将第一层数据进行拷贝,嵌套着的第二层数据不拷贝,还是在原来的内存地址,内存地址不会变。而深拷贝则不同,会将第二层的数据也进行拷贝,另辟内存进行保存,所以就算原来的所嵌套的内容有所改变,复制后的也不会改变。

2.1 赋值

1 lst1 = [‘紫衫龙王‘, ‘青翼蝠王‘, ‘金毛狮王‘, ‘白眉鹰王‘]
2 lst2 = lst1
3 lst1.append(‘张无忌‘)
4 print(lst2)

对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制一份内容. 所以. lst1的内存指向和lst2是一样的. lst1改变了, lst2也发生了改变

2.2 浅拷贝

1 lst1 = [‘紫衫龙王‘, ‘青翼蝠王‘, ‘金毛狮王‘, [‘白眉鹰王‘, ‘赵本山‘]]
2 lst2 = lst1.copy()
3 lst2[3].append(‘新成员‘)
4 print(lst1)
5 print(id(lst1[3]), id(lst2[3]))
6 # 结果:[‘紫衫龙王‘, ‘青翼蝠王‘, ‘金毛狮王‘, [‘白眉鹰王‘, ‘赵本山‘, ‘新成员‘]]
7 # 2049414915328 2049414915328

从运行结果中可以看到,当拷贝后的lst2进行添加新元素的操作时,原来的列表发生了改变,这说明嵌套列表中的内容并没有完全拷贝到lst2,新旧列表中关于其内存地址也是相同的,浅拷贝只是将嵌套列表的内存地址进行了拷贝。

2.3 深拷贝

 1 import copy
 2 lst1 = [‘紫衫龙王‘, ‘青翼蝠王‘, ‘金毛狮王‘, ‘白眉鹰王‘, [‘赵敏‘, ‘周芷若‘]]
 3 lst2 = copy.deepcopy(lst1)
 4 lst2[4].append(‘新成员‘)
 5 print(lst1, lst2)
 6 print(id(lst1[4]), id(lst2[4]))
 7 print(id(lst1), id(lst2))
 8 # 结果:[‘紫衫龙王‘, ‘青翼蝠王‘, ‘金毛狮王‘, ‘白眉鹰王‘, [‘赵敏‘, ‘周芷若‘]]
 9 # [‘紫衫龙王‘, ‘青翼蝠王‘, ‘金毛狮王‘, ‘白眉鹰王‘, [‘赵敏‘, ‘周芷若‘, ‘新成员‘]]
10 # 2572522151232 2572522346240
11 # 2572522149120 2572522346880

可以看出,深拷贝将嵌套内容完全拷贝,新开辟内存进行保存,当复制版的lst2中的嵌套内容发生变化时,不会影响原来的列表。

原文地址:https://www.cnblogs.com/Studying-Du/p/12345292.html

时间: 2025-01-18 05:06:21

Python学习之路(四):基础知识之深浅拷贝的相关文章

Python学习之路-Day1-Python基础

Python学习之路第一天 学习内容: 1.Python简介 2.安装 3.第一个Python程序 4.变量 5.字符编码 6.用户输入 7.表达式if..else语句 8.表达式for语句 9.break和continue 10.while循环 11.字符串格式化 1.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOB

python学习之路_python基础(1)

学习内容: 1.python介绍 2.python程序初接触和变量 3.python用户交互 4.python数据类型 5.python循环if...(elif)...else 6.python循环while...else 7.python循环for...else 8.python循环中断break和continue 一.python介绍 1)python优缺点 先看优点: Python的定位是“优雅”.“明确”.“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容

python学习之路(基础篇)——python入门

一.python是一门编程语言,作为学习python的开始,需要事先搞明白:编程的目的是什么?什么是编程语言?什么是编程? 编程的目的:将人的思想转换成机器能理解的语言,利用机器的优势扩大个人的能力,实现更广阔的目标. 编程语言   : 能够被计算机所理解的语言即为编程语言.编程语言是程序员与计算机沟通的介质. 编程          :编程是程序员将自己思想流程按照编程规则写下来,产出的结果就是包含一堆字符的文件. 二.程序语言分类 机器语言:直接用二进制编程,直接操作硬件 汇编语言:简写的英

PYTHON学习之路_PYTHON基础(4)

学习内容: 1.Python函数的基本语法 2.Python函数的返回值与变量 3.Python嵌套函数 4.Python递归函数及实例(二分查找) 5.Python匿名函数 6.Python内置方法 7.Python实例 一.Python函数的基本语法 1.定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 def f(n): print (n**n) return n**2 2.特性 (一)减少重复代码 (二)使程序变的可扩展 (三)使程序变

PYTHON学习之路_PYTHON基础(3)

学习内容: 1.Python集合 2.Python文件操作 3.Python字符编码 4.Python函数介绍 一.Python集合 1)集合的创建: list_1 = [1,3,5,7,26,8,65]list_1=set(list_1) list_2 =set([2,4,5,6,7,9,65]) print (list_1,list_2) 2)集合间的操作: print ("交集:", list_1.intersection(list_2)) #交集print("并集&q

python学习之路-5 基础进阶篇

本篇涉及内容 双层装饰器字符串格式化 双层装饰器 装饰器基础请点我 有时候一个功能需要有2次认证的时候就需要用到双层装饰器了,下面我们来通过一个案例详细介绍一下双层装饰器: 执行顺序:自上而下 解释顺序:自下而上 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

PYTHON学习之路_PYTHON基础(8)

学习内容: Python模块介绍 1.经典类 or 新式类 2.抽象接口 3.静态方法.类方法.属性方法 4.反射 5.异常处理 6.socket编程初识 7.用socket实现get.put文件等功能 一.经典类 or 新式类 二.抽象接口 3.静态方法.类方法.属性方法 4.反射 5.异常处理 try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理. 如果你不想在异常发生时结束你的程序,只需在try里捕获它. 语法: 以下为简单的try....exce

python学习之路(基础篇)——基本语法流程控制

一.hello world程序 1. 在linux 下创建一个文件叫hello.py,并输入 print("Hello World!") 然后执行命令:python hello.py ,输出 localhost:~ jieli$ vim hello.py localhost:~ jieli$ python hello.py Hello World! 2.由 python 解释器来执行 #!/usr/bin/env python print "hello,world"

python学习之路(基础篇)——函数

一.简单介绍 三种编程: 面向对象  class    面向过程   def    函数式编程   def 过程是没有返回值的函数 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 1.减少重复代码 2.使程序变的可扩展(改一处,都改) 3.使程序变得易维护 语法定义 def sayhi():#函数名 print("Hello, I'm nobody!") sayhi() #调用函数 可以带参数 二.函数的参数 1 def