---恢复内容开始---

1.变量、地址

变量的实现方式有:引用语义、值语义

  python语言中变量的实现方式就是引用语义,在变量里面保存的是值(对象)的引用(值所在处内存空间的地址)。采用这种方式,变量所需的存储空间大小一致,因为其中只需要保存一个引用。而有些语言(例如c)采用的不是这种方式,它们把变量直接保存在变量的存储区里,这种方式就称为值语义。这样的话,一个整数类型的变量就需要保存一个整数所需要的空间(例如c语言中int类型占用4个字节大小,所能表示的数的最大值为2^32,2147483647)。

  python中变量与对象的引用关系类似于c语言的指针变量与指针指向值的关系。

  在python的数据结构中,对象分为可变对象不可变对象。基本数据类型如int、float等都是不可变对象。在结构数据类型中,元祖tuple、str是不可变对象,list(列表)、dict(字典)、set(集合)是可变对象,可变对象存储的元素的引用其实是没有改变的,改变的是其引用指向的值。

  采用引用语义存储的只是一个变量的值所在的内存地址,而不是这个变量的值本身。

如上所示,变量中存储的是值的引用,也就是指所在内存空间的地址。

 id函数(python的内置函数,用来查看对象的身份,也就是内存地址)

  对于给变量赋值时,每一次的赋值都会产生一个新的地址空间,将新内容的地址赋值给变量,但是对于相同的值,地址不发生变化。

  对复杂的数据类型(列表、元祖、字典),如果添加某一项元素,或者添加几个元素,不会改变其本身的地址,只会改变其内部元素的地址引用,但是如果对其重新赋值时,就会重新赋予地址覆盖就地址,这时地址就会发生改变。

  python中相同的值的不同对象,相当于内存中对于相同值的对象保存了对份。但是对于不可变数据类型,内存中只能有一个相同值的对象。同时要看是否产生新的对象。

2.浅拷贝和深拷贝

copy.copy():浅拷贝,不管多复杂的数据结构,浅拷贝都只会copy一层。

copy.deepcopy():深拷贝,会完全复制原变量相关的所有数据,到最后一层(自身包含的所有子列表)。在内存那种生成一套完全一样的内容。

  由上图可以看出,浅拷贝,只拷贝一层,因此当list_重新赋值以后,浅拷贝后list_2包含的子列表发生了变化,而而深拷贝以后的列表list_3所包含的字列表并没有发生改变。深拷贝等于完全复制并重新开辟新的内存空间,和原列表两者之间互不影响。

3.值传递与引用传递:

  可变对象为引用传递,不可变对象为值传递。(函数传值)

值传递:被调函数在执行时,首先对收到的参数对象生成一个副本,在执行过程中,是对参数副本的操作,并不会对原参数产生改变。也就是在堆栈中开辟内存空间存放由主调函数传进来的实参对应的副本值。特点:函数对收到的参数的任何操作,不会对原参数(实参变量)产生影响。

引用传递:当传递列表或者字典时,如果改变引用的值,就改变了原始对象。(引用传递直接传的是地址,是对原始对象的直接操作。)

由上图可以看出,引用传递,函数修改的直接是实参的值。但是,在函数体中不能直接修改整个列表或者字典的值,这样做,也等于创建实参的副本,并不会对实参本身产生影响。如下图所示。

   

  

---恢复内容结束---

python中变量在内存中的存储与地址关系解析、浅度/深度copy、值传递、引用传递的更多相关文章

  1. Java变量在内存中的存储

    目录 Java变量在内存中的存储 成员变量 局部变量 总结 Java变量在内存中的存储 以下探究成员变量和局部变量在内存中的存储情况. package com.my.pac04; /** * @aut ...

  2. vs中调试程序查看变量在内存中的内容的方法

    vs中调试程序 查看变量在内存中的内容的方法 https://blog.csdn.net/guojg1988/article/details/42922149 原文链接:http://www.sows ...

  3. python值的引用传递和go语言的值传递

    一:值传递 实参a 原本指向地址 1638212,代表1638212这个地址的值是3.在swap函数中,实参a将值拷贝给形参a,形参a此时也在内存中拥有地址,地址= xxxx,值为3,在所有的函数体内 ...

  4. 详解Python变量在内存中的存储

    这篇文章主要是对python中的数据进行认识,对于很多初学者来讲,其实数据的认识是最重要的,也是最容易出错的.本文结合数据与内存形态讲解python中的数据,内容包括: 引用与对象 可变数据类型与不可 ...

  5. PHP变量在内存中的存储方式

    原文:http://www.phppan.com/tag/refcount/ 每门计算机语言都需要一些容器来保存变量数据.在一些语言当中,变量都有特定的类型,如字符串,数组,对象等等.比如C和Pasc ...

  6. JavaScript中的变量在内存中的具体存储形式

    栈内存和堆内存 JavaScript中的变量分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型是保存在堆内存中的对象,值大小不固 ...

  7. Python基础(列表中变量与内存关系)

    在Python中,copy的是内存地址,引用的是列表的引用地址,列表里存的是各个元素的地址 例如: name = [1,2,3,4,['xfxing','summer',6]] n2 = name.c ...

  8. C语言中浮点数在内存中的存储方式

    关于多字节数据类型在内存中的存储问题 //////////////////////////////////////////////////////////////// int ,short 各自是4. ...

  9. java中变量在内存的位置

    package day02; /* * 成员变量:在堆内存中,因为对象的存在,才在内存中存在:作用于整改类中 * 局部变量:在栈内存中:作用于函数中,或者语句中 * */ class car{ //描 ...

随机推荐

  1. 什么是YAML?

    YAML是"YAML不是一种标记语言"的外语缩写 [1] (见前方参考资料原文内容):但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名.它是一种直观的能 ...

  2. QQ空间玩吧HTML5游戏引擎使用比例分析

    GameLook报道/“Cocos 2015开发者大会(春季)”于4月2日在国家会议中心圆满落下帷幕.在会上全新的3D编辑器,Cocos Runtime等产品重磅公布,给业界带来了Cocos这款国产引 ...

  3. c# winform快捷键实现

    我们在软件中经常用到快捷键,这里整理备份一下. 首先我们要定义可以作为快捷键的按键,以下是整理的 一些,自己可以根据情况来修改 public static Dictionary<int, str ...

  4. QTcpSocket 对连接服务器中断的不同情况进行判定

    http://blog.csdn.net/goforwardtostep/article/details/52300335

  5. F4帮助

    在INITIALIZATION之后添加 AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_month-low 事件,s_month-low为要添加的搜索帮助. 下面 ...

  6. sql关联查询—将一个表的查询结果作为新表进行查询操作

    例题:#  各个部门中 最高工资中最低的那个部门的 最低工资是多少? 先考虑取得各个部门最高工资 SELECT MAX(salary) AS max_salary,e.`department_id` ...

  7. HBase 学习之路(十)—— HBase的SQL中间层 Phoenix

    一.Phoenix简介 Phoenix是HBase的开源SQL中间层,它允许你使用标准JDBC的方式来操作HBase上的数据.在Phoenix之前,如果你要访问HBase,只能调用它的Java API ...

  8. 【转】JDK 内存参数含义

    Eclipse崩溃,错误提示: MyEclipse has detected that less than 5% of the 64MB of Perm  Gen (Non-heap memory) ...

  9. 使用git提交时报错:error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large

    Delta compression using up to 4 threads.Compressing objects: 100% (2364/2364), done.Writing objects: ...

  10. 记录微信浏览器里word链接点击没反应的bug

    有用户反应点击下载附件时没有反应,让用户把该下载链接复制到微信对话框中,发现点击该链接仍然无反应,但是在内置的手机浏览器中打开是正常的而且可以下载. 链接地址,有需要的可以拿去进行测试: http:/ ...