我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python3 基础(赋值与生深浅拷贝

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python3  基础(赋值与生深浅拷贝

一 python的变量与以及存储
变量是对内存的以及地址的抽象,对于python而言python的一切变量都是对象,变量的存储采用了引用语义的方式,存储的只是一个变量所在值的内存地址,而不是这个变量的本身 。
引用语义:在python中,变量的保存时对象(值)的应用,称之为引用语义,采用这种语义,变量所需存储的空间大小一致。因为变量只是一个保存的引用。

值: 把变量的值直接保存在变量的存储区域里,采用这种存储方式 ,每一个在内存中所占的空间,就要根据变量的实际大小来定,无法固定下来。

二 各个基本的数据结构地址存储以及改变情况。
在python中的数据类型包括:bool,int,long,float,str,set,list,tucp,dict 等等 ,
这些数据类型可以分为简单数据类型,和复杂数据类型。
简单数据类型和复杂数据类型划分依据:
如果一个数据类型可以将其他的数据类型作为自己的元素。 则可以认为是一种数据结构,数据结构的分类有很多种,在python中常用的只有集合,序列和映射这三种数据结构 。 对应的是 set, list(tuple,str),dict,常用的数据类型有 int , long,float,bool,str 等 。
由于python中的变量都是采用的引用语义,数据结构可以包含基础数据类型,导致了在python中的数据存储方式存在下图所示的这种情况,每个变量中都存储了这个变量的地址,而不是值本身;对于复杂的数据结构来说。里面的存储也只是每个元素的地址而已
Python3  基础(赋值与生深浅拷贝)

Python3  基础(赋值与生深浅拷贝)

当对列表进行增,删,改查工作的时候 ,是不会影响到对于list整个本身的地址 ,只会改变其内部元素的地址应用, 可是当对列表进行重新赋值的时候,就给lst1这个列表地址赋予了一个新的地址,覆盖了原本列表的地址,这个时候,lst1的内存id就发生了变化。
Python3  基础(赋值与生深浅拷贝)
Python3  基础(赋值与生深浅拷贝)

内存的变化 , 其实的赋值操作都让str1,str2都存储了'hello wolrd' 是这个地址 ,重新对str1 赋值,是str1中存储的地址发生了改变,重新只想了新建的地址此时str2变量的存储的内存地址并为改变,所以不受影响。

Python3  基础(赋值与生深浅拷贝)

Python3  基础(赋值与生深浅拷贝)

2 复杂的数据结构的赋值

Python3  基础(赋值与生深浅拷贝)

Python3  基础(赋值与生深浅拷贝)

上序代码做了修改操作,但是并没有对lst2做出改变,结果lst1和lst2都发生了变化,

四 拷贝简述
上述内容讲述了变量赋值的过程,对于复杂的数据结构来说,赋值就等于完全共享了资源,一个值的改变会完全被另外一个值给共享。

五 浅拷贝
不管多么复杂的数据结构浅拷贝只会copy一层

lst = ['str1', 'str2', 'str3', 'str4', 'str5']
sourceLst = ['str1', 'str2', 'str3', 'str4', 'str5', lst]
copyLst = copy.copy(sourceLst)

print('1.->sourceLst:', sourceLst)
print('1.->copyLst:', copyLst)

sourceLst.append('sourcestr')
copyLst.append('copystr')

print('2.->sourceLst:', sourceLst)
print('2.->copyLst:', copyLst)

sourceLst[0] = 'changestr'
print('3.->sourceLst:', sourceLst)
print('3.->copyLst:', copyLst)

lst.append('testAppend')
print('4.->sourceLst:', sourceLst)
print('4.->copyLst:', copyLst)
 上述代码执行会是下述结果:

复制代码
1.->sourceLst: ['str1', 'str2', 'str3', 'str4', 'str5', ['str1', 'str2', 'str3', 'str4', 'str5']]
1.->copyLst: ['str1', 'str2', 'str3', 'str4', 'str5', ['str1', 'str2', 'str3', 'str4', 'str5']]
2.->sourceLst: ['str1', 'str2', 'str3', 'str4', 'str5', ['str1', 'str2', 'str3', 'str4', 'str5'], 'sourcestr']
2.->copyLst: ['str1', 'str2', 'str3', 'str4', 'str5', ['str1', 'str2', 'str3', 'str4', 'str5'], 'copystr']
3.->sourceLst: ['changestr', 'str2', 'str3', 'str4', 'str5', ['str1', 'str2', 'str3', 'str4', 'str5'], 'sourcestr']
3.->copyLst: ['str1', 'str2', 'str3', 'str4', 'str5', ['str1', 'str2', 'str3', 'str4', 'str5'], 'copystr']
4.->sourceLst: ['changestr', 'str2', 'str3', 'str4', 'str5', ['str1', 'str2', 'str3', 'str4', 'str5', 'testAppend'], 'sourcestr']
4.->copyLst: ['str1', 'str2', 'str3', 'str4', 'str5', ['str1', 'str2', 'str3', 'str4', 'str5', 'testAppend'], 'copystr']
 上述代码中, sourceLst和copyLst中存储的都是地址,当独自修改各个list的时候,另一个不会改变。而当修改共有的lst元素的时候,sourceLst和copyLst都会发生改变,这种情况发生在字典套字典,列表套字典,字典套列表,列表套列表,以及各种复杂数据结构的嵌套中。

六、深拷贝

  上述讲述了浅拷贝,而在实际情况中,我们希望复杂的数据结构之间完全copy,而他们之间又没有一毛钱关系。

  为此,python引入了深拷贝的概念,我们可以使用copy模块中的deepcopy方法。深拷贝会完全复制原变量相关的所有数据,在内存中生成一套完全一样的内容,在这个过程中我们队这两个变量中的一个进行任意修改都不会影响其他变量。

  浅拷贝的情况:

lst1 = [1,2,3,4,[5,6,7,8]]
lst2 = lst1 # 实际进行了一个浅拷贝
id(lst2)
4363600648
id(lst1)
4363600648
lst1[0] = 100
lst1
[100, 2, 3, 4, [5, 6, 7, 8]]
lst2
[100, 2, 3, 4, [5, 6, 7, 8]]
lst2[4][0] = 100
lst1
[100, 2, 3, 4, [100, 6, 7, 8]]
复制代码

import copy

lst1 = [1,2,3,4,[5,6,7,8]]
lst2 = copy.deepcopy(lst1)
id(lst1)
4363594504
id(lst2)
4363593928
lst1[0] = 100
lst2
[1, 2, 3, 4, [5, 6, 7, 8]]
lst2[4][0]=100
lst1
[100, 2, 3, 4, [5, 6, 7, 8]]
复制代码
从上述代码中可以看出,进行深拷贝后,lst1和lst2的地址不一样,而且两个独自修改并不影响另一个的值,他俩现在一毛钱关系都没有。

  深拷贝就是在内存中重新开辟一块空间,不管数据结构多么复杂,只要遇到可能发生改变的数据类型,就重新开辟一块内存空间把内容复制下来,知道最后一层,不再有复杂的数据类型,就保持其原引用,这样,不管数据结构多么复杂,数据之间的修改都不会相互影响。这就是深拷贝~

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python3 基础(赋值与生深浅拷贝

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

下载Word文档

猜你喜欢

Python3 基础(赋值与生深浅拷贝

一 python的变量与以及存储变量是对内存的以及地址的抽象,对于python而言python的一切变量都是对象,变量的存储采用了引用语义的方式,存储的只是一个变量所在值的内存地址,而不是这个变量的本身 。 引用语义:在python中,变
2023-01-31

python列表中的赋值与深浅拷贝

首先创建一个列表a=[[1,2,3],4,5,6]一、赋值a=[[1,2,3],4,5,6]b=aa[0][1]='tom'print(a)print(b)结果:[[1, 'tom', 3], 4, 5, 6][[1, 'tom', 3],
2023-01-30

Python中赋值、浅拷贝、深拷贝三者的区别

本篇文章为大家展示了Python中赋值、浅拷贝、深拷贝三者的区别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python有哪些常用库python常用的库:1.requesuts;2.scrapy;
2023-06-14

Python直接赋值与浅拷贝和深拷贝实例讲解使用

浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联
2022-11-13

python按引用赋值和深、浅拷贝

按引用赋值而不是拷贝副本在python中,无论是直接的变量赋值,还是参数传递,都是按照引用进行赋值的。在计算机语言中,有两种赋值方式:按引用赋值、按值赋值。其中按引用赋值也常称为按指针传值(当然,它们还是有点区别的),后者常称为拷贝副本传值
2023-01-30

如何解析Python中的赋值、浅拷贝和深拷贝

这篇文章给大家介绍如何解析Python中的赋值、浅拷贝和深拷贝,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。先明确几点不可变类型:该数据类型对象所指定内存中的值不可以被改变。(1)、在改变某个对象的值时,由于其内存中的
2023-06-22

js数组直接赋值的问题(js数组的浅拷贝与深拷贝方法)

JS数组在直接赋值时属于数组的浅拷贝,新数组保存的是原数据的内存地址,修改新数组或原数组其中一个数组,另一个数组也会相应的变化,数组的直接赋值属于数组的浅拷贝,JS存储对象都是存内存地址
2022-11-13

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解概述在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值、复制、浅拷贝、深拷贝等绕口的名词到底有什么区别和作用
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录