iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python学习笔记:第7天 深浅拷贝
  • 759
分享到

python学习笔记:第7天 深浅拷贝

深浅学习笔记python 2023-01-30 22:01:48 759人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录 1. 基础数据类型补充 2. set集合 3. 深浅拷贝 1. 基础数据类型补充 (1)join方法 join方法是

目录

  • 1. 基础数据类型补充
  • 2. set集合
  • 3. 深浅拷贝

1. 基础数据类型补充

(1)join方法

join方法是把一个列表中的数据进行拼接,拼接成字符串(与split方法相反,split方法是把一个字符串切割成列表)

In [1]: l1 = ['a', 'b', 'c']

In [2]: s1 = ''

In [3]: for i in l1:            # 如果不使用join方法需要自己使用循环拼接成字符串
   ...:     s1 += i + '-'

In [4]: s1.strip('-')
Out[4]: 'a-b-c'

In [5]: l1
Out[5]: ['a', 'b', 'c']

In [6]: s2 = '-'.join(l1)       # 使用join方法可以直接把字符串拼接

In [7]: s2
Out[7]: 'a-b-c'

(2)列表和字典的删除及类型转换

对于列表和字典的删除,有一个需要注意的地方,我们先来看个例子:

In [10]: l2 = [ 'a', 'b', 'c', 'e', 'f' ]

In [11]: for i in l2:
    ...:     l2.remove(i)

In [12]: l2
Out[12]: ['b', 'e']

In [13]:

上面的例子中是遍历列表l2并循环删除列表中的元素,但是最后打印时还存在2个元素‘b’和‘e’,为什么这两个元素没有被删除,分析如下:

  • 首次遍历列表时,i的值为‘a’,然后在列表中把元素删除后,列表中后面的索引位置都往前移动了一位,此时索引为0的位置的值为‘b’
  • 第二次次遍历时,取到索引为1的元素是‘c’,也就是在列表中把‘c’删除了,然后后面的索引又往前移动了
  • 第三次循环时i的值为‘f’,把元素‘f’删除后,循环结束,于是最后还剩下了2个元素

从上面的分析来看,我们可以得出:在循环遍历列表时,不应该去删除列表的元素,否则后续的程序可能出现意料之外的错误;如果需要删除多个元素可以使用下面这种方法:

In [19]: l2 = [ 'a', 'b', 'c', 'e', 'f' ]

In [20]: del_l2 = []

In [21]: for i in l2:           # 遍历列表,把要删除的元素添加到另一个列表中,然后再对列表进行删除
    ...:     del_l2.append(i)

In [22]: for i in del_l2:
    ...:     l2.remove(i)

In [23]: l2
Out[23]: []

In [24]:

然后我们再来看下字典遍历时的问题:

In [24]: d1 = {'a':1, 'b':2}

In [25]: for k in d1:
    ...:     del d1[k]
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-25-a77d5961c011> in <module>
----> 1 for k in d1:
      2     del d1[k]

RuntimeError: dictionary changed size during iteration

In [26]:

从上面的结果可以看出,字典在遍历的时候不允许做删除操作(RuntimeError: dictionary changed size during iteration),要删除时跟列表一样,把要删除的元素的key保存在列表中,循环结束后再删除。

(3)字典的fromkey方法及数据类型转换

fromkey方法

dict中的fromkey(),可以帮我们通过list来创建⼀个dict:

In [26]: dict.fromkeys('abc', 100)
Out[26]: {'a': 100, 'b': 100, 'c': 100}

In [27]: dict.fromkeys('abc', [100, 200, 300])
Out[27]: {'a': [100, 200, 300], 'b': [100, 200, 300], 'c': [100, 200, 300]}

In [28]: d2 = dict.fromkeys('abc', 100)

In [29]: d2
Out[29]: {'a': 100, 'b': 100, 'c': 100}

In [30]: d3 = dict.fromkeys('abc', [100, 200, 300])

In [31]: d3
Out[31]: {'a': [100, 200, 300], 'b': [100, 200, 300], 'c': [100, 200, 300]}

fromkey方法接收两个参数,第一个是一个可迭代的数据,迭代出的每个元素作为字典的key,第二个参数作为字典value,但是这里要注意的是,如果第二个参数是一个可变的数据类型,只要修改其中一个值那么其他的值也会被修改:

In [32]: d3['a'].pop()
Out[32]: 300

In [33]: d3
Out[33]: {'a': [100, 200], 'b': [100, 200], 'c': [100, 200]}

数据类型的转换

  • 元组 => 列表 list(tuple)
  • 列表 => 元组 tuple(list)
  • list=>str str.join(list)
  • str=>list str.split()
  • 转换成False的数据:
    • 0,'',None,[],(),{},set() ==> False
    • 不为空 ===> True

2. set集合

set中的元素是不重复的.⽆序的,⾥⾯的元素必须是可hash的(int, str, tuple,bool), 我们可以这样来记:set就是dict类型的数据但
是不保存value, 只保存key,set也⽤{}表⽰。

set中的元素是不重复的, 且⽆序的:

In [34]: s1 = {'a', 'a', 'b', 'b', 'c'}

In [35]: s1
Out[35]: {'a', 'b', 'c'}

In [36]: s2 = {1, 2, [11, 22]}              # set集合中的元素必须是可hash的,但是set本身是不可hash的
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<iPython-input-36-e5e6f226f8af> in <module>
----> 1 s2 = {1, 2, [11, 22]}

TypeError: unhashable type: 'list'

In [37]:

使用元素唯一性的这个特性,可以对对数据去重处理:

In [39]: l1 = [1, 2, 3, 2, 2, 3]

In [40]: l1
Out[40]: [1, 2, 3, 2, 2, 3]

In [41]: set(l1)
Out[41]: {1, 2, 3}

In [42]:

字典的方法

  • add 添加一个元素
  • clear 清空元素
  • pop 随机删除
  • remove 删除指定元素
  • update 对集合进行更新
  • uNIOn 并集运算
  • difference 差集运算
  • intersection 交集运算
  • symmetric_difference 反交集运算
  • issubset 子集
  • issuperset 超集

3. 深浅拷贝

(1)赋值操作

In [44]: a = [1, 2, 3, 4]

In [45]: b = a

In [46]: a.append(10)

In [47]: a, b
Out[47]: ([1, 2, 3, 4, 10], [1, 2, 3, 4, 10])

In [48]: c = {'a':1, 'b':2}

In [49]: d = c

In [50]: d['c'] = 5

In [51]: d
Out[51]: {'a': 1, 'b': 2, 'c': 5}

In [52]: c
Out[52]: {'a': 1, 'b': 2, 'c': 5}

In [53]:

对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 所以当列表a变了后列表b也跟着变了,字典也是一样。

(2)浅拷贝

In [53]: l1
Out[53]: [1, 2, 3, 2, 2, 3]

In [54]: l2 = l1.copy()

In [55]: l2
Out[55]: [1, 2, 3, 2, 2, 3]

In [56]: l1.append('SEL')

In [57]: print(l1, l2)
[1, 2, 3, 2, 2, 3, 'SEL'] [1, 2, 3, 2, 2, 3]

In [58]:

从上面的例子可以看出,浅复制(使用copy方法)会把列表l1的内容赋值一份给l2,此时修改l1的内容并不会影响列表l2的内容,下面的图可以看出变量存放再内存的情况:

In [61]: l3 = l2.copy()

In [62]: l3
Out[62]: [1, 2, [3, 'SEL']]

In [63]: l2[2].append('hello')

In [64]: l2
Out[64]: [1, 2, [3, 'SEL', 'hello']]

In [65]: l3
Out[65]: [1, 2, [3, 'SEL', 'hello']]

In [66]:

但是此时我们可以看到,使用浅拷贝虽然会复制列表里面的内容,但仅仅是包含第一层,如果列表里面嵌套了列表,内层的列表的内容变话的话,被复制的列表也会变化,如上所示,把l2的值拷贝给l3之后,修改了l2中嵌套的列表,l3中的也会改变,如下图所示:

(3)深拷贝

In [66]: import copy            # 需要导入copy模块

In [67]: l5 = [1, 2, ['a', 'b', ['aa', 'bb'], 3]]

In [68]: l6 = copy.deepcopy(l5)

In [69]: l5
Out[69]: [1, 2, ['a', 'b', ['aa', 'bb'], 3]]

In [70]: l6
Out[70]: [1, 2, ['a', 'b', ['aa', 'bb'], 3]]

In [71]: l5[2][2].append('cc')

In [72]: l5
Out[72]: [1, 2, ['a', 'b', ['aa', 'bb', 'cc'], 3]]

In [73]: l6
Out[73]: [1, 2, ['a', 'b', ['aa', 'bb'], 3]]

In [74]:

深度拷贝会完全复制整个列表里的内容,再次修改之前的列表时,新列表并不会受影响:

--结束END--

本文标题: python学习笔记:第7天 深浅拷贝

本文链接: https://www.lsjlt.com/news/180090.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python学习笔记:第7天 深浅拷贝
    目录 1. 基础数据类型补充 2. set集合 3. 深浅拷贝 1. 基础数据类型补充 (1)join方法 join方法是...
    99+
    2023-01-30
    深浅 学习笔记 python
  • Python学习 :深浅拷贝
    深浅拷贝   一、浅拷贝 只拷贝第一层数据(不可变的数据类型),并创建新的内存空间进行储蓄,例如:字符串、整型、布尔 除了字符串以及整型,复杂的数据类型都使用一个共享的内存空间,例如:列表 列表使用的是同一个内存地址,指向原拷贝的值,即使...
    99+
    2023-01-30
    深浅 Python
  • Python学习笔记:第一天python
    目录 1. python简介 2. python的安装 3. 编写第一个helloword 4. 变量和常量 5. 数据...
    99+
    2023-01-30
    学习笔记 Python python
  • Python学习笔记:第2天while循
    目录 1. while循环 continue、break和else语句 2. 格式化输出 3. 运算符 ...
    99+
    2023-01-30
    学习笔记 Python
  • python 学习笔记 7 -- Pyt
    学习一门语言最重要的功课是练习与复习,在《笨方法学Python》中第三十七节虽然没有教你任何内容,但是它提醒我们:“学了这么多,你还能记得多少?该复习了!”下面我们就对这一节的第一部分“关键字”来做个复习:Python中的关键字包括如下:a...
    99+
    2023-01-31
    学习笔记 python Pyt
  • python学习笔记:第17天 面向对象
    一、类与类之间的依赖关系 ⼤千世界, 万物之间皆有规则和规律. 我们的类和对象是对⼤千世界中的所有事物进⾏归类. 那事物之间存在着相对应的关系. 类与类之间也同样如此. 在⾯向对象的世界中. 类与类 中存在以下关系: 依赖关系 关联关系...
    99+
    2023-01-30
    面向对象 学习笔记 python
  • python学习笔记:第16天 面向对象
    目录 ⼀、类的成员介绍: 二、类的成员-变量 三、类的成员-方法 四、类的成员-属性 五、私有属性 ...
    99+
    2023-01-30
    面向对象 学习笔记 python
  • python学习笔记:第19天 类的约束
    目录 一、类的约束 二、异常处理: 三、MD5加密 四、日志(logging模块) 一、类的约束 真正写写...
    99+
    2023-01-30
    学习笔记 python
  • Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解
    Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解概述在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值、复制、浅拷贝、深拷贝等绕口的名词到底有什么区别和作用...
    99+
    2023-06-02
  • python学习笔记:第6天 小数据池和
    目录 1. id 和 == 2. 小数据池 3. 编码和解码 1. id 和 == id:id是一个内置的函数,可以查...
    99+
    2023-01-30
    学习笔记 数据 python
  • 第一周Python学习笔记
     Python 基本语法: ①  Python程序的格式:1.用代码高亮来标识函数丶语句等等 本身的代码高亮并没有实际的意义,只是用来辅助编程人员和阅读人员 更好的识别    2.程序以缩进来标识语句,缩进用来标识代码间的层次关系,缩进的...
    99+
    2023-01-30
    学习笔记 第一周 Python
  • Python基础学习之深浅拷贝问题及递归函数练习
    目录一、深浅拷贝问题二、递归函数练习1. 求阶乘2. 猴子吃桃问题3. 打印斐波那契数列一、深浅拷贝问题 在实际工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修...
    99+
    2024-04-02
  • Python第八周 学习笔记(1)
    基本概念个体继承自父母,继承了父母的一部分特征,但也可以有自己的个性 子类继承了父类,就直接拥有了父类的属性和方法,也可以定义自己的属性、方法,甚至对父类的属性、方法进行重写 Python继承实现 class Cat(Anima...
    99+
    2023-01-31
    学习笔记 Python
  • Python学习笔记7——文本、模块
    参考书籍:《Learning_Python_5th_Edition.pdf》,一本英文书呢,我上传到百度网盘吧,请点击这里,密码是:kym3 文本文件的输入输出 Python具有基本的文本文件读写功能。Python的标准库提供有更丰富的读...
    99+
    2023-01-30
    学习笔记 模块 文本
  • Python第五周 学习笔记(2)
    一、实现一个cache装饰器,实现可过期被清除的功能 简化设计,函数的形参定义不包含可变位置参数、可变关键词参数和keyword-only参数 可以不考虑缓存满了之后的换出问题 1)原始 def cache(fn): imp...
    99+
    2023-01-31
    学习笔记 Python
  • Python第一周 学习笔记(3)
    一、数值型 1.数据类型分类: int:整数 python3的int就是长整型,且没有大小限制,受限于内存区域的大小int(x) 返回一个整数 float:浮点数 有整数部分和小数部分组成。支持十进制和科学计数法表示。只有双精度型。f...
    99+
    2023-01-31
    学习笔记 第一周 Python
  • Python第九周 学习笔记(1)
    get(self, instance, owner) 访问属性时调用 set(self, instance, value) 当对属性赋值时调用 delete(self, instance) 删除属性时调用 sel...
    99+
    2023-01-31
    学习笔记 Python
  • Python第六周 学习笔记(3)
    1.指定一个源文件,实现copy到目标目录 个人实现: def filecopy(filename:str, cp_filename:str): ''' Author: lijl Description: 复制文...
    99+
    2023-01-31
    学习笔记 六周 Python
  • Python第二周 学习笔记(3)
    1.运用数组实现求10万以内质数: prime = [2] for i in range(3,100000,2): flag = False up = int(i**0.5)+1 for j in prime: ...
    99+
    2023-01-31
    学习笔记 Python
  • Python学习笔记—第一章—Pytho
    书目:Python(Unix和Linux系统管理指南)学习日期:20120627知识点总结:Python的优势:既简单易学,也可以完成任何复杂任务可读性好(严格的代码缩进格式)支持面向对象编程(OOP)强大的Python社区强大的Pytho...
    99+
    2023-01-31
    学习笔记 Python Pytho
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作