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

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. Linux下如何查看高CPU占用率线程 专题

    Java 系统性能分析 命令 1. cpu分析 top , pidstat(sysstat) pid -p PID -t 1 10 vmstat 1 CPU上下文切换.运行队列.利用率 ps Hh - ...

  2. 程序的开机关机重启,开机启动,休眠功能delphi实现(使用AdjustTokenPrivileges提升权限)

    TShutDownStatus = (sdShutDown,sdReboot,sdLogOff,sdPowerOff); procedure ShutDown(sdStatus : TShutDown ...

  3. Delphi7 时钟(使用了多个自定义组件)

    http://download.csdn.net/detail/akof1314/3073289

  4. Perl Scripts / 脚本

    树状递归列出目录下面子目录和文件 #!/usr/bin/perl #List all files and sub-directories as tree #Under current director ...

  5. QT5的post Event解析

    大家都知道,QT的事件机制,查了好多网上的帖子,分析的不够到位,今天给大家分享下,我的分析,请高手指正:都知道post Event通过    QScopedPointer<QEvent> ...

  6. IIS 站点和应用池命令启动和停止

    在CMD下执行如下命令: IIS站点: 停止站点: C:\Windows\System32\inetsrv\appcmd.exe stop site “XXXX” 启动站点: C:\Windows\S ...

  7. 模拟实现 Tomcat 的核心模块:NIO,HTTP,容器和集群

    如果你想看 Tomcat 源码但又无从入手,不妨从这个项目开始,代码量不多,但包含了 Tomcat 的核心处理流程,并且源码中有相当丰富的注释.相信通过此项目你能了解: NIO 基本编程.HTTP 协 ...

  8. vscode左边侧边栏字体的大小

    相信很多小伙伴们都会在用vscode的时候,当屏幕大小发生变化的时候,你可能会觉得左边的字体太小了,我也遇到了这样的问题,百度也没有找到解决办法,自己摸索了几天,发现可以通过ctrl+shift+ + ...

  9. kuberbetes基础概念

    部署了一大堆,来了解一下K8S一些基本的概念. 1.Node Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod.Node上运行着Kubern ...

  10. Apple官文中的KVO 与 FBKVOController

    前言 本文将主要介绍以下内容: 详细列出Apple官文中KVO的注意事项(Apple KVO相关的引用皆摘自Apple官文). 介绍FBKVOController,以及它如何避免系统提供的KVO坑点. ...