python 深浅复制与指针内存
Python是一门非常好的语言,他的长处在于拥有巨大灵活性的同一时候也拥有无比的严谨性,其它语言规定了非常多语法。告诉你什么情况下,语法就是这种,而Python却用非常少的规定,延伸出非常多语法,有些语法看上去非常奇怪,细致分析却是那么的合理。今天思考了Python中关于指针和深浅复制的问题,以下希望能通过依据内存空间的变化对这些让人头疼的问题作出一个解释。
首先看第一个样例:
a = 1
b = a
b = 2
print ’a = %s‘ %a, ‘b = %s’%b
结果:a = 1 b = 2
当运行a = 1操作时,内存中先分配一个整型变量的空间并赋值为1。然后将a指向这块空间,运行b = a时,将b也指向这块内存,这时,a和b的地位是一样的。b = 2。按说会把当前b指向的那块内存赋值为2,事实上Python并不会这样做。由于在Python中。整型以及其它基本类型加上字符串和元组等是不能够被改动的。意思是他们一旦被声明。在内存上就不能被改变。
那么运行b = 2时发生的是。系统分配一个整型的内存。并赋值为,再将这块内存的地址赋给b,因此a和b就指向了不同的值。
在看一个非常矛盾的样例:
a=[1,[2],3]
b=a
b[0]=0
print a
结果:[0,[2],3]
这好像不太对。和上面说的有点矛盾。事实上并不矛盾。由于列表是能够改动的,a和b指向的是一个列表,事实上列表时存的是一组指针。指针是能够改动的。元组不能改动就是由于元组里的数据是内存上的数据本身。而列表里元素是指针。
当使用b改动b[0]时,实际上是将原本指向一个1的指针b[0]同一时候也是a[0]指向了一个0。而那个1假设没有别的指针指向他的话。他就被回收了。
这个0和1尽管索引一样,但在内存中的位置不同。我无比的希望能够打印指针的内容来验证我的想法。
内存情况例如以下:
赋值之后:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDM1MjY5NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
以下说一下copy()和deepcopy()。
deepcopy()就不用说了。这个就是严格的深复制。两个指针一点关系都没有。谁也不会影响谁。由于他们在内存中是独立的。
而copy就不行了。他是copy()有别于直接赋值,但它又不同于deepcopy()。举个样例:
import copy
a=[1,[2],3]
b=copy.copy(a)
b[0]=0
b[1].append(2)
print a
结果为:[1,[2,2],3]
折结果看似意外。事实上是十分合理的。copy()是一种浅复制,b实际上是a的一个影子。系统也为b分配了自己的空间。意味着a和b指向的内存并不同样。可是,b中仅仅复制了a中的指针。意思是b的每一项和a中的每一项指向的内存是同样的。当对b[0]赋值为0时,b[0]从指向1改为指向0,而a[0]还是指向1的,因此a的第一项仍为1。而b[1].append(2)时,b[1]和a[1]指向同一个列表,这个列表就是[2]。
这条语句并没有改动指针而是让[2]添加了一个元素。a[1]和b[1]还是指向这个列表的。
因此a[1]变为[2,2]。
画一下的话应该是这个样子:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDM1MjY5NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
上图是copy()过后的内存情况。
经过操作后内存的情况例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDM1MjY5NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
上面v就是我对Python内存管理和指针的理解。如有错误,请指正。
python 深浅复制与指针内存的更多相关文章
- Python 深浅复制
(一)浅复制 复制列表最简单的方式是使用内置类型的构造方法: >>> l1 = [1, [2, 3], (4, 5)] >>> l2 = list(l1) > ...
- 2019-04-15 python深浅复制
原作地址:https://www.cnblogs.com/xueli/p/4952063.html 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,pyth ...
- 【Python初级】由判定回文数想到的,关于深浅复制,以及字符串反转的问题
尝试用Python实现可以说是一个很经典的问题,判断回文数. 让我们再来看看回文数是怎么定义的: 回数是指从左向右读和从右向左读都是一样的数,例如1,121,909,666等 解决这个问题的思路,可以 ...
- python基础学习之深浅复制的概念
1.深浅复制 浅复制,python自带,深复制需要导入模块包 import copy 使用深浅复制,根据id不同写出他们的区别a = [1,2,3]b = [6,7,8]s1 = [a,b]print ...
- Python基础之列表深浅复制和列表推导式
一.列表深浅复制: 浅拷贝内存图如下: 深拷贝内存图如下: 二.列表推导式: 实例: """ 列表推导式 练习:exercise01 """ ...
- Python 字符串拼接、格式化输出、深浅复制
拼接:"+"号(同类型可拼接) >>>li = [1,2] >>>li + li [1,2,1,2] >>>li*2 [1,2 ...
- Python格式化输出和深浅复制
字符串的四种拼接方法,常用格式化 deepcopy(深复制) bytes 和 bytearray 的基本用法 字符串拼接 使用 + 格式化字符串 使用join 用单引号内的字符来拼接,参数填一个整体 ...
- python基础知识03-格式化输出和深浅复制
VIM中HJKL可以上下左右移动光标. 格式化输出和深浅复制 1.字符串的拼接和格式化 sudo pip3 install ipython 安装 ipython 进入 字符串相加 str1 + str ...
- 详谈OC(object-c)深浅复制/拷贝-什么情况下用retain和copy
读前小提示:对于深浅复制有一个清楚的了解,对于学习oc的朋友来说,至关重要.那么首先,我们要明白深浅复制是如何定义的呢.这里为了便于朋友们理解,定义如下. 浅 复 制:在复制操作时,对于被复制的对象的 ...
随机推荐
- 25. TABLESPACES , 26. TABLE_CONSTRAINTS , 27. TABLE_PRIVILEGES
25. TABLESPACES TABLESPACES表提供有关活动MySQL Cluster表空间的信息. TABLESPACES表有以下列: TABLESPACE_NAME :表空间名称 ENGI ...
- alt、title和label
alt是html标签的属性,而title既是html标签,又是html属性. title标签这个不用多说,网页的标题就是写在<title></title>这对标签之内的. ti ...
- ps---打开文件及图片保存格式
1.打开图片,可以按Ctrl或者Shift来进行多张图片的选择或者用鼠标框选. 2.勾选图像序列,可以选择命名上有次序的多个图像. 3. PSD是ps里面的标准保存格式,包含颜色.图层.通道.路径.动 ...
- 在cmd 命令中 用cd E:\ 进入不了E盘 问题
cd 路径 只能在本盘符中切换路径需要切换到e盘 需要cd /d e:\
- tornado框架基础06-SQLAlchemy连接数据库
01 ORM 在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢? 和数据库相关,不同的数据库需要 ...
- 准备新的代码迁移到cnblogs
http://www.cnblogs.com/danghuijian/ http://www.cnblogs.com/danghuijian/
- jmeter-添加断言(检查点)-实例
方法/步骤 打开 jmeter的图形界面工具,然后打开之前保存的脚本(之前经验中用到的),demo-baidu.jmx 先点击运行,查看运行结果. 第一次请求返回302,然后跳转到第二次请 ...
- nmon分析与详解
1.命令安装 1.查看liunx版本版本x86_64_14i 目录:cd /nmon/logs/ 版本x86_64_14i [root@localhost u06]# cd / [root@local ...
- Python变量及数据类型
所有编程语言几乎都会有 ’ 变量‘ ,如 a = 2,用一个a变量指代数字2,在Python中,一切皆对象,因此在变量赋值的时候实际上是在内存中开辟了一块存储变量内容的内存空间对象. 对象可以指定不同 ...
- CodeForces 610B-Vika and Squares,有坑点,不是很难~~
B. Vika and Squares time limit per test 2 seconds memory limit per test 256 megabytes input standard ...