Python中的赋值和拷贝
赋值
在python中,赋值就是建立一个对象的引用,而不是将对象存储为另一个副本。比如:
>>> a=[1,2,3]
>>> b=a
>>> c=a
对象是[1,2,3]。分别由a、b、c三个变量其建立了相应的引用关系。而三个变量都不独占对象[1,2,3],或者说。能够通过不论什么一个变量来改动[1,2,3]这个对象。
>>> c.append(4)
>>> c
[1, 2, 3, 4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> b.append("from b")
>>> b
[1, 2, 3, 4, 'from b']
>>> a
[1, 2, 3, 4, 'from b']
>>> c
[1, 2, 3, 4, 'from b']
拷贝
拷贝有浅拷贝和深拷贝之分。首先看以下的样例
>>> a=[1,2,3] #建立a与对象的引用连接
>>> b=a #通过赋值。b也与对象建立引用
>>> import copy
>>> c=copy.copy(a) #浅拷贝,建立了一个[1,2,3]的副本。即一个新的对象
>>> d=copy.deepcopy(a) #深拷贝,建立了一个[1,2,3]的副本。
至此,a、b、c、d的关系例如以下图所看到的:
a--|
|-->[1,2,3]
b--|
c----->[1,2,3]
d----->[1,2,3]
改动a
>>> a.append('aa') #通过变量a改动原对象,使它变成[1,2,3,'aa']
>>> b #b也同步改变
[1, 2, 3, 'aa']
>>> c #c相应的是一个副本。没有受到影响
[1, 2, 3]
>>> d #d同上道理
[1, 2, 3]
a、b、c、d的关系例如以下图所看到的:
a--|
|-->[1,2,3,'aa']
b--|
c----->[1,2,3]
d----->[1,2,3]
改动c:
>>> c.append("cc") #改动c的对象
>>> a #a没有受到影响。由于a、c是指向不同对象
[1, 2, 3, 'aa']
>>> b
[1, 2, 3, 'aa']
>>> c
[1, 2, 3, 'cc']
>>> d
[1, 2, 3]
a、b、c、d的关系例如以下图所看到的:
a--|
|-->[1,2,3,'aa']
b--|
c----->[1,2,3,'cc']
d----->[1,2,3]
在上面的样例中,似乎copy和deepcopy没有什么差别,都是另外建立一个副本。且看例如以下样例:
>>> q=[1,2,3,['a','b']] #注意,这个对象是一个list,里面另一个元素是list,即q[3]=['a','b']
>>> w=copy.copy(q) #w、e分别是浅拷贝和深拷贝的副本对象引用
>>> e=copy.deepcopy(q)
>>> q.append('4q') #q所相应的[1,2,3,['a','b']]变成[1,2,3,['a','b'],'4q']
>>> q
[1, 2, 3, ['a', 'b'], '4q']
>>> w #w,e如同前面一样。没有受到影响
[1, 2, 3, ['a', 'b']]
>>> e
[1, 2, 3, ['a', 'b']]
改动w的相应列表
>>> w.append(4)
>>> w #添加了一个整数4
[1, 2, 3, ['a', 'b'], 4]
>>> q #q和e都没有受到影响
[1, 2, 3, ['a', 'b']]
>>> e
[1, 2, 3, ['a', 'b']]
>>> q
[1, 2, 3, ['a', 'b']]
改动w[3]的元素。提示:w是对q进行浅拷贝而得。
>>> w[3].append('w3c')
>>> q
[1, 2, 3, ['a', 'b', 'w3c']]
>>> w
[1, 2, 3, ['a', 'b', 'w3c'], 4]
>>> e
[1, 2, 3, ['a', 'b']]
细致观察上面的结果,发现:
- q和w。当改动了列表里面的列表元素之后,两个同步改动了。
- e没有受到影响
也就是浅拷贝。仅仅建立了外层的副本,对于内层的副本没有建立;而深拷贝。建立了完整的副本。这就理解了汉语的翻译名称“浅”拷贝之含义了,其“浅”就是拷贝了一层(外层)。
进一步改动e看看效果:
>>> e.append('5e')
>>> q
[1, 2, 3, ['a', 'b', 'w3c']]
>>> w
[1, 2, 3, ['a', 'b', 'w3c'], 4]
>>> e
[1, 2, 3, ['a', 'b'], '5e']
>>> e[3].append('e3c')
>>> q
[1, 2, 3, ['a', 'b', 'w3c']]
>>> w
[1, 2, 3, ['a', 'b', 'w3c'], 4]
>>> e
[1, 2, 3, ['a', 'b', 'e3c'], '5e']
有思考的程序猿,看到这里就会提出一个问题。为什么要有浅拷贝和深拷贝呢?它们分别是怎样工作的?在奇妙的网络上,对这个问题有回答,请參考以下两个连接内容:
Python中的赋值和拷贝的更多相关文章
- python中的赋值与拷贝(浅拷贝与深拷贝)
1.赋值与拷贝 直接赋值(b=a)是传引用,b改动a也会改动. a = [1, 2, 3, 4] b = a b[1] = 999 print(a, b) #[1, 999, 3, 4] [1, 99 ...
- Python 中的赋值、拷贝、引用
在 python 中赋值语句总是建立对象的引用值,而不是复制对象.因此,python 变量更像是指针,而不是数据存储区域. 如图所示,当改变一个变量的值,另一个的值也会跟着改变.也就是浅拷贝. 若要实 ...
- python中的“赋值与深浅拷贝”
Python中,赋值与拷贝(深/浅拷贝)之间是有差异的,这主要源于数据在内存中的存放问题,本文将对此加以探讨. 1 赋值(添加名字) 赋值不会改变内存中数据存放状态,比如在内存中存在一个名为data的 ...
- 【转】Python中的赋值、浅拷贝、深拷贝介绍
这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下 和很多语言一样,Python中 ...
- python中的赋值操作和复制操作
之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...
- Python中的赋值、深拷贝与浅拷贝(内存地址)
Python中的赋值.深拷贝与浅拷贝(内存地址) 1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test(): a = {} b = a print ...
- python中的赋值操作
参考:https://www.cnblogs.com/andywenzhi/p/7453374.html?tdsourcetag=s_pcqq_aiomsg(写的蛮好) python中的赋值操作“=” ...
- python中的赋值和深浅拷贝
python中,A object = B object 是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个对象在内存中的位置 . 此时当B对象里面的内容发生更改的时候,A对象也自然而然的 ...
- Python中的赋值语法
Python中复制语法有6种 Basic Form >>>spam = 'spam' Tuple assignment >>>spam, ham = 'spam', ...
随机推荐
- Centos7初次开机提示Initial setup of CentOS Linux 7 (core)
安装完成centos7后出现如下提示: Initial setup of CentOS Linux 7 (core) 1) [x] Creat user 2) [!] License informat ...
- Oracle中的锁
Oracle中的锁 锁是一种机制,多个事务同时访问一个数据库对象时,该机制可以实现对并发的控制 按照用户系统锁可以分为自动锁和显示锁. 自动锁(系统上锁):DML锁.DDL锁.systemlocks锁 ...
- grafana 安装- 曲线图展示每秒新增数据量
下载: https://dl.grafana.com/oss/release/grafana-5.4.2.windows-amd64.zip 解压就能用 添加数据源 添加查询条件 sql 模式编写查询 ...
- Python3 笔记01:求两数之和
这是来自于leetcode的题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...
- js移动终端浏览器版本
//当要在不同移动终端浏览器中运行不同的代码时,需要对各个终端浏览器进行判断 //判断浏览器 var browser = { versions: function () { var u = navig ...
- pom.xml 如果使用 mvn exec:exec 命令运行项目
pom.xml 如果使用 mvn exec:exec 命令运行项目,红色字体要与groupid相同 <project xmlns="http://maven.apache.org/PO ...
- JavaScript try-catch语句(错误处理)
错误处理在处理程序设计中的重要性是毋庸置疑的,任何有影响力的web应用程序都需要一套完善的错误处理机制.当然,大多数佼佼者确实做到了这一点,但通常只有服务器端应用程序才能做到如此.实际上,服务器端团队 ...
- 献给java求职路上的你们
为了更好的树立知识体系,我附加了相关的思维导图,分为pdf版和mindnote版.比如java相关的导图如下: 由于时间仓促,有些地方未写完,后面会继续补充.如有不妥之处,欢迎及时与我沟通. 相关概念 ...
- Java 实验案例(类和对象篇)
实验任务 任务一:手机类的封装 任务二:基于控制台的购书系统 任务三:简单的投票程序 实验内容 任务一:手机类的封装 任务目的 理解和掌握面向对象的设计过程 掌握类的结构和定义过程 掌握构造方法及其重 ...
- git 错误error: failed to push some refs to
今天使用VSCODE 学习node.js, 想在git上push代码 于是在git上建立了一个私有的长裤, 连接后push代码时提示如下错误: error: failed to push some ...