python学习笔记-(六)深copy&浅copy

在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。

1. 赋值

赋值其实只是传递对象引用,引用对象id是一样的。原始列表改变,被赋值的b也会做相同的改变。


1

2

3

4

5

6

7

8

9

10

11

12

13

>>> alist = [1,2,3,["a","b"]]

>>> b = alist

>>> print(b)

[123, [‘a‘‘b‘]]

>>> alist.append(5)

>>> alist = [1,2,3,["a","b"]]

>>> b = alist

>>> print(b)

[123, [‘a‘‘b‘]]

>>> alist.append(5)

>>> print(alist);print(b)

[123, [‘a‘‘b‘], 5]

[123, [‘a‘‘b‘], 5]

2.浅拷贝

浅拷贝是指拷贝的只是原始对象元素的引用,换句话说,浅拷贝产生的对象本身是新的,但是它的内容不是新的,只是对原对象的一个引用。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

>>> import copy

>>> alist=[1,2,3,["a","b"]]

>>> c = copy.copy(alist)

>>> print(alist);print(c)

[123, [‘a‘‘b‘]]

[123, [‘a‘‘b‘]]

>>> alist.append(5)

>>> print(alist);print(c)

[123, [‘a‘‘b‘], 5]

[123, [‘a‘‘b‘]]

>>> alist[3]

[‘a‘‘b‘]

>>> alist[3].append(‘cccc‘)

>>> print(alist);print(c)

[123, [‘a‘‘b‘‘cccc‘], 5]

[123, [‘a‘‘b‘‘cccc‘]] #里面的子对象被改变了

浅copy的几种方式:

  • 使用切片[:]操作进行拷贝


    1

    2

    3

    4

    >>> alist = [1,2,3,["a","b"]]

    >>> c = alist[:]

    >>> print(c)

    [123, [‘a‘‘b‘]]

  • 使用工厂函数(如list/dir/set)等进行拷贝


    1

    2

    3

    4

    >>> alist = [1,2,3,["a","b"]]

    >>> c = list(alist)

    >>> print(c)

    [123, [‘a‘‘b‘]]

  • copy.copy()


    1

    2

    3

    4

    >>> alist = [1,2,3,["a","b"]]

    >>> c = copy.copy(alist)

    >>> print(c)

    [123, [‘a‘‘b‘]]

3. 深拷贝

深拷贝是指完全拷贝原始对象,而且产生的对象是新的,并且不受其他引用对象的操作影响。

深copy:

Names2 = copy.deepcopy(names)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

>>> import copy

>>> alist=[1,2,3,["a","b"]]

>>> d=copy.deepcopy(alist)

>>> print(alist);print(d)

[123, [‘a‘‘b‘]]

[123, [‘a‘‘b‘]]始终没有改变

>>> alist.append(5)

>>> print(alist);print(d)

[123, [‘a‘‘b‘], 5]

[123, [‘a‘‘b‘]]始终没有改变

>>> alist[3]

[‘a‘‘b‘]

>>> alist[3].append("ccccc")

>>> print(alist);print(d)

[123, [‘a‘‘b‘‘ccccc‘], 5]

[123, [‘a‘‘b‘]]  始终没有改变

时间: 2024-08-07 01:05:15

python学习笔记-(六)深copy&浅copy的相关文章

【Python学习笔记之二】浅谈Python的yield用法

在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,for循环可以用于Python中的任何类型,包括列表.元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前

Python学习笔记六:列表、元组、字典

学习其他语言很少关注数组是的结构是怎么回事,都是直接使用.Python定义了列表.元组.字典三种数据结构,是我们使用python的基础,因此有必要理解它们的含义,我想这个和python一切皆对象的思想有关.python的数据结构更加灵活. 1. 列表[lists] 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列都可以进行的操作包括索引,切片,加

python学习笔记六:字典

字典是python中唯一内建的映射类型. 特点: 没有特殊的顺序: 存储在特定的键(key)下,可以是数字.字符串甚至是元组 创建和使用字典 phonebook= {'Alice':'2341', 'Beth':'9102','Cecil':'3258'} a.由键-值组成,上述例子中,名字是键,电话号码是值 b.键与值用冒号(:)隔开 c.每一对键-值使用逗号(,)隔开 d.整个字典由一对大括号括起来 e.空字典:{} dict函数 >>> items = [('name','Gumb

Python学习笔记六(常用模块、面向对象基础)

一.random模块 import random print(random.random()) #0-1之间的小数 print(random.randint(1,5)) #1-5之间(包括1和5)的整数 print(random.randrange(1,5)) #1-5之间(包含1,不好包含5)的整数 print(random.choice(['a','b','c'])) #给定列表中任意元素 print(random.sample(['a','b','c','d'],2)) #给定列表中任意n

Python学习笔记(六)再谈Python模块

Python程序包含多个模块文件,一个主体.顶层文件实现主要控制流程.调用组件和工具,其他模块文件则提供组件和工具,python自带了许多实用的模块称为标准链接库.模块是python中最高级别的程序组织单元,将代码和数据封装起来以便重用.每一个文件都是一个模块,并且可以通过"导入"来使用其他模块的变量(顶层定义的所有变量).模块被导入时就生成了一个模块对象.从抽象的角度看,模块的作用有: 1)代码重用-模块文件的代码可以永久保存,可以被多个客户端使用.任意的重新运行和重载 2)划分系统

python学习笔记六之模块下(基础篇)

shevle 模块 扩展pickle模块... 1.潜在的陷进 >>> import shelve>>> s = shelve.open("nb") >>> s['x'] = ['a','b','c'] >>> s['x'].append('d') >>> s['x'] ['a', 'b', 'c'] 解析:当你在shelve对象中查找元素的时候,这个对象都会根据已经存储的版本进行重新构建,当你将

python学习笔记(六):常用模块

一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包,package本质就是一个文件夹,和文件夹不一样的是它有一个__init__.py文件,包是从逻辑上来组织模块的,也就是说它是用来存放模块的,如果你想导入其他目录下的模块,那么这个目录必须是一个包才可以导入. 导入模块 1 2 3 4 5 import module #导入模块 from modul

Python学习笔记六--文件和输入输出

6.1文件对象 所有Python对文件的操作都是基于对文件对象的操作.那么就从文件对象的创建说起.open()[file()]提供初始化输入输出的接口.open()成功打开文件时会返回一个文件对象. open()方法的语法: file_object=open(filename,access_mode,buffering) filename,表示要打开的文件名的字符串,可以是相对路径也可以是绝对路径. access_mode,表示打开方式.常见有'r'.'w'.'a',分别表示读模式,写模式,追加

Python学习笔记六:文件处理

一:打开文件 open(name,mode,[bufferSize]) name:文件路径 mode:文件打开方式 二:文件读取 read()方法:可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示. readline([size]):如果不传参,一次默认读取一行.如果size<一行长度,则读取size个字节.如果size>一行长度,则只读取一行. readlines():一次读取io.DEFAULT_BUFFER_SIZE行,约586行,以字符串数组的形式返回读取结

Python学习笔记六:集合

集合 Set,去重,关系测试:交.并.差等:无序 list_1=set(list_1), type(list_1) list_2=set([xxxxx]) 交集:list_1.intersectin(list_2), list_1 & list_2 并集:list_1.union(list_2), list_1 | list_2 差集:list_1.diffrence(list_2), list_1 – list_2 子集:list_1.issubset(list_2) 父集:list_1.is