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 深浅复制与指针内存的更多相关文章

  1. Python 深浅复制

    (一)浅复制 复制列表最简单的方式是使用内置类型的构造方法: >>> l1 = [1, [2, 3], (4, 5)] >>> l2 = list(l1) > ...

  2. 2019-04-15 python深浅复制

    原作地址:https://www.cnblogs.com/xueli/p/4952063.html 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,pyth ...

  3. 【Python初级】由判定回文数想到的,关于深浅复制,以及字符串反转的问题

    尝试用Python实现可以说是一个很经典的问题,判断回文数. 让我们再来看看回文数是怎么定义的: 回数是指从左向右读和从右向左读都是一样的数,例如1,121,909,666等 解决这个问题的思路,可以 ...

  4. python基础学习之深浅复制的概念

    1.深浅复制 浅复制,python自带,深复制需要导入模块包 import copy 使用深浅复制,根据id不同写出他们的区别a = [1,2,3]b = [6,7,8]s1 = [a,b]print ...

  5. Python基础之列表深浅复制和列表推导式

    一.列表深浅复制: 浅拷贝内存图如下: 深拷贝内存图如下: 二.列表推导式: 实例: """ 列表推导式 练习:exercise01 """ ...

  6. Python 字符串拼接、格式化输出、深浅复制

    拼接:"+"号(同类型可拼接) >>>li = [1,2] >>>li + li [1,2,1,2] >>>li*2 [1,2 ...

  7. Python格式化输出和深浅复制

    字符串的四种拼接方法,常用格式化 deepcopy(深复制) bytes 和 bytearray 的基本用法 字符串拼接 使用 + 格式化字符串 使用join 用单引号内的字符来拼接,参数填一个整体 ...

  8. python基础知识03-格式化输出和深浅复制

    VIM中HJKL可以上下左右移动光标. 格式化输出和深浅复制 1.字符串的拼接和格式化 sudo pip3 install ipython 安装 ipython 进入 字符串相加 str1 + str ...

  9. 详谈OC(object-c)深浅复制/拷贝-什么情况下用retain和copy

    读前小提示:对于深浅复制有一个清楚的了解,对于学习oc的朋友来说,至关重要.那么首先,我们要明白深浅复制是如何定义的呢.这里为了便于朋友们理解,定义如下. 浅 复 制:在复制操作时,对于被复制的对象的 ...

随机推荐

  1. 用Multisim实现彩灯循环控制器

    2019/06/06 !转载请注明出处 1.设计任务目的与要求 1.1 展示器件 10路彩灯分别用10个发光二极管L0.L1…..L9模拟,发光二极管L0.L1…..L9从左到右排列. 1.2 要求显 ...

  2. Windows 命令收集

    定时关机命令:schtasks /create /tn "关机" /tr "shutdown /s" /sc once /st 23:55

  3. Windows环境下安装 mysql-8.0.11-winx64 遇到的问题解决办法

    下载mysql安装包,我的是下载mysql-8.0.11-winx64,解压到你想安装的目录下,然后配置环境(window环境下,mac本还没试过), 1.首先,配置环境:右击此电脑->属性-& ...

  4. 1.INFORMATION_SCHEMA简介

    1. INFORMATION_SCHEMA简介 INFORMATION_SCHEMA提供对数据库元数据的访问,有关MySQL服务器信息,例如数据库或表的名称,列的数据类型或访问权限. INFORMAT ...

  5. 4. InnoDB表单独表空间

    4. InnoDB表单独表空间 从历史上看,所有InnoDB表和索引都存储在系统表空间中.这种单片方法的目标是完全专用于数据库处理的机器,精心规划的数据增长,其中任何分配给MySQL的磁盘存储都不会用 ...

  6. tcpdump抓包指令使用示例

    tcpdump是一个用于截取网络分组,并输出分组内容的工具. tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具.tcpdump提供了源代码,公开了 ...

  7. 树莓派 - RasberryPi推送数据到cloudMQTT

    创建用户 在https://www.cloudmqtt.com/上创建一个帐户 转到右上角的控制面板 点击"创建"按钮 安装lib sudo pip install paho-mq ...

  8. LoadRunner之并发用户数与迭代关系---并发数与迭代的区别

    Q1: 例如在LR里,我要测100个用户同时并发登陆所用时间,那我是不是在录制好脚本后,需要参数化“用户名”,“密码”以及在那个记事本里构造100个真实的用户名和密码? 然后运行Controller, ...

  9. MySQL数据库不识别server=.而是识别localhost

    MySQL数据库不识别server=.而是识别localhost

  10. HDU-3746Cyclic Nacklace,next数组简单应用。

    Cyclic Nacklace 节省篇幅不粘题面了... 看懂题后脑袋里略过KMP,学过但没怎么用过,又直接跳下一题了.. 题意:给定一个字符串,可以从两边加上一些字符使其有循环节..求最少需要加多少 ...