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的朋友来说,至关重要.那么首先,我们要明白深浅复制是如何定义的呢.这里为了便于朋友们理解,定义如下. 浅 复 制:在复制操作时,对于被复制的对象的 ...
随机推荐
- SecureCRT 64位 破解版v8.1.4
http://www.xue51.com/soft/1510.html#xzdz securecrt 破解版是一款支持SSH1和SSH2的终端仿真程序,这个程序能够在windows系统中登陆UNIX或 ...
- day22 01 初识面向对象----简单的人狗大战小游戏
day22 01 初识面向对象----简单的人狗大战小游戏 假设有一个简单的小游戏:人狗大战 怎样用代码去实现呢? 首先得有任何狗这两个角色,并且每个角色都有他们自己的一些属性,比如任务名字nam ...
- [Android]使用button切换TextView可见和不可见
<Button android:id="@+id/btnTest" android:layout_width="match_parent" android ...
- 【04】Firebug页面概况查看
Firebug页面概况查看 使用Firebug的概况,你可以测试Web页面导致延迟加载的文件. 通过打开页面 Firebug > Console(控制台)> Profile(概况). 你需 ...
- Oracle中有关日期的语法
Oracle中有关日期的语法 Oracle提供了丰富的日期函数.利用日期函数可以灵活的对日期进行运算. to_date()函数——将字符串转换为日期型 to_date()函数用于将字符串转换为日期.被 ...
- zoj 2829 Beautiful Number
Beautiful Number Time Limit: 2 Seconds Memory Limit: 65536 KB Mike is very lucky, as he has two ...
- 尼姆博弈扩展形式(一): 限定每次取物的上限。NYOJ-135,难度5~~~
取石子(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:5 http://acm.nyist.net/JudgeOnline/problem.php?pid=135 描述 小 ...
- 【搜索】codeforces C. The Tag Game
http://codeforces.com/contest/813/problem/C [题意] 给定一棵有n个结点的树,初始时Alice在根结点1,Bob在非根结点x; Alice和Bob轮流走,每 ...
- 楼房重建(bzoj 2957)
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- OC-runtime 的温习
-.runtime简介 runtime简称运行时,OC就是运行时机制,也就是运行时的一些机制,其中最主要的是消息机制: 对于C语言,函数的调用在编辑的时候,会决定调用哪个函数: 对于OC的函数,属于动 ...