浅析Python中的赋值和深浅拷贝

 更新时间:2017年08月15日 08:19:12   作者:Des李白  
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。接下来通过本文给大家分享Python中的赋值和深浅拷贝,感兴趣的朋友一起看看吧

python中,A object  = B object  是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个对象在内存中的位置 。

此时当B对象里面的内容发生更改的时候,A对象也自然而然的会跟着更改。

name = ["root","admin"]
cp_name = name # 对cp_name进行赋值操作
# 对name列表进行插入
name.append('root_temp')
print(name,cp_name) # ['root', 'admin', 'root_temp'] ['root', 'admin', 'root_temp']
print(id(name),id(cp_name)) # 23991960 23991960

而想要进行浅拷贝或者深拷贝,就需要引入copy模块 。

首先来说下浅拷贝,当进行浅拷贝时,使用copy.copy()方法。

import copy
name = ["root","admin"]
# 进行浅拷贝操作
cp_name = copy.copy(name)
# 查看cp_name,name
print(name,cp_name) # ['root', 'admin'] ['root', 'admin'] 拷贝成功
#查看地址
print(id(name),id(cp_name)) # 21146920 21147160 内存地址并不相同
# 尝试对name进行更改
name.append('root_temp')
# 查看cp_name是否更改
print(cp_name) # ['root', 'admin'] 内容并没有更改

A = copy.copy(B) 此时A对象相当于把B对象中的内容给完成的拷贝了一份,存储在了一份新的内存地址当中。

其中有一点需要注意,如下:

import copy
name = ['root','admin',['root_temp','admin_temp']]
cp_name = copy.copy(name)
# 查看两个对象的地址
print(id(name),id(cp_name)) # 24358504 24428952 二者的地址并不相同
# 对name 进行更改
name.append('test')
# 查看cp_name是否更改
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp']] cp_name并未更改
# 在来对name中的列表对象进行更改
name[2].append('ttttt')
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp', 'ttttt']] 发现cp_name内容发生了变化

在上面的代码中,通过copy.copy()方法把name对象浅拷贝给了cp_name,此时二者的内容相同,但是地址不同,说明通过浅拷贝后,cp_name相当于重新开辟了一块内存空间用来存储拷贝过来的内容。所以说,当name.append()第一次插入值的时候,cp_name对象没有变化,因为cp_name和name 处于两个不同的内存空间,是独立的。

而浅拷贝的问题在于,只能够拷贝第一层的内容,至于说第二层以及第三层或者第n层,对于浅拷贝来说都是无能为力的,只能简单的拷贝一份内存地址。

所以说,对于name 这个对象中,列表第一层发生更改,是不会影响cp_name的,而一旦更改了第二层或者第n层的内容,cp_name都会被影响,因为此时的cp_name对象里面子列表是与name的子列表共享相同的内存空间。

而如果想要对第一层以及第二层甚至第n层都进行彻底的拷贝,那么就需要使用深层拷贝。

深层拷贝需要使用copy模块的deepcopy()方法。

import copy
name = ['root','admin',['root_temp','admin_temp']]
cp_name = copy.deepcopy(name)
# 查看二者的id
print(id(name),id(cp_name)) # 29863528 29933976 地址不同,说明开辟了处于两块不同的空间
# 对name 第一层以及第二层进行更改
name.append('t1')
name[2].append('t2')
# 查看cp_name是否内容发生变化
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp']] 内容并未发生更改

此时,cp_name对象并不会被name所影响,无论name对象的第一层列表还是第n层的更改和变化,都不会影响cp_name,因为此时通过深层拷贝,两个对象已经完全的处于两个不同的独立内存空间,而这也就是深层拷贝。

总结

以上所述是小编给大家介绍的Python中的赋值和深浅拷贝,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • scrapy头部修改的方法详解

    scrapy头部修改的方法详解

    这篇文章主要给大家介绍了关于scrapy头部修改的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 基于python实现百度语音识别和图灵对话

    基于python实现百度语音识别和图灵对话

    这篇文章主要介绍了基于python实现百度语音识别和图灵对话,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • python办公自动化之读取本地OUTLOOK客户端邮件

    python办公自动化之读取本地OUTLOOK客户端邮件

    这篇文章主要为大家详细介绍了如何使用python实现读取本地OUTLOOK客户端邮件,文中的示例代码讲解详细,具有一定的参考价值,需要的小伙伴可以了解下
    2023-10-10
  • python重复值处理得方法

    python重复值处理得方法

    这篇文章主要介绍了python重复值处理得方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • Python黑魔法Descriptor描述符的实例解析

    Python黑魔法Descriptor描述符的实例解析

    与迭代器和装饰器等一样,描述符也是Python编程中的一项高级技巧,这里我们就来讲解Python黑魔法Descriptor描述符的实例解析:
    2016-06-06
  • Python Flask框架扩展操作示例

    Python Flask框架扩展操作示例

    这篇文章主要介绍了Python Flask框架扩展操作,结合实例形式分析了Python Flask-Script扩展命令行操作实现方法,需要的朋友可以参考下
    2019-05-05
  • 如何创建第一个Pygame程序

    如何创建第一个Pygame程序

    本文主要介绍了如何创建第一个Pygame程序,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 使用python将图片按标签分入不同文件夹的方法

    使用python将图片按标签分入不同文件夹的方法

    今天小编就为大家分享一篇使用python将图片按标签分入不同文件夹的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python插入排序算法的实现代码

    python插入排序算法的实现代码

    这篇文章主要介绍了python插入排序算法的实现代码,大家参考使用吧
    2013-11-11
  • 如何使用Python对NetCDF数据做空间相关分析

    如何使用Python对NetCDF数据做空间相关分析

    这篇文章主要介绍了如何使用Python对NetCDF数据做空间相关分析,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04

最新评论