Python中一切皆为对象,不管是集合变量还是数值型or字符串型的变量都是一个引用,都指向对应内存空间中的对象。

简而言之:

变量直接赋值:新变量本身及其内部的元素都与原变量指向相同的内存空间,并且值相同,当一个发生变化时,另一个也随之变化。
变量浅拷贝:新变量本身与原变量指向不同的内存空间,但是新变量内部的元素与原变量指向相同的内存空间;当改变原变量内部的可变对象的值时,新变量内部的值也发生随之变化;改变原变量内部的不可变对象的值时,新变量内部的值不随之变化;反之亦然(即改变新变量时)。
变量深拷贝:新变量与原变量本身及其内部元素都指向不同的内存空间,改变原变量的值时,新变量中的值不会发生变化,反之亦然。
 
1. 不可变对象:int,float,long,str,tuple等;
 
 1 In[20]: a = 1
2 In[21]: b = a
3 In[22]: id(a)
4 Out[22]: 33719592L
5 In[23]: id(b)
6 Out[23]: 33719592L
7 In[24]: a = 2
8 In[25]: id(a)
9 Out[25]: 33719568L
10 In[26]: id(b)
11 Out[26]: 33719592L
12 In[27]: b = 3
13 In[28]: id(b)
14 Out[28]: 33719544L
 
可以看出最开始a、b指向同一个内存空间,但是当改变a的值时,a指向了新的内存空间(此时b没有发生变化),改变b时b也指向了新的内存空间;类似于C语言中的值传递。
 
2. 可变对象:list,set,dict, array, matrix等
 
 In[29]: list1 = [1,2,3]
In[30]: list2 = list1
In[31]: id(list1)
Out[31]: 61244552L
In[32]: id(list2)
Out[32]: 61244552L
In[33]: list1[0] = 101
In[34]: id(list1)
Out[34]: 61244552L
In[35]: id(list2)
Out[35]: 61244552L
In[36]: list1
Out[36]: [101, 2, 3]
In[37]: list2
Out[37]: [101, 2, 3]
In[38]: list2[1] = 102
In[39]: id(list1)
Out[39]: 61244552L
In[40]: id(list2)
Out[40]: 61244552L
In[41]: list1
Out[41]: [101, 102, 3]
In[42]: list2
Out[42]: [101, 102, 3]

刚开始list1和list2指向同一个内存空间,改变list1中的值时,list2也跟着改变,但是它们指向的内存空间没有发生变化;同样,改变list2中的值时,list1的值也跟着变化,它们仍然指向同一个内存空间。

浅拷贝和深拷贝:

下述例子中:b和a指向同一个内存空间,改变a中的值,则b跟着改变。c是a浅拷贝,c指向和a不同的内存空间,但是如果a中有一个元素为可变对象,则c中的此元素和a中的元素指向同一个内存空间,则改变a中此可变对象里面的值时,c中的值也改变;改变a中不可变对象的元素的值时,c中的值不发生变化。d是a的深拷贝,d和a指向不同的内存空间,d内部的元素和a内部元素也指向不同的空间,改变a里面的值时,d不会发生变化。

例子说明:

 1 import copy
2 a = [1,[1, 2, 3], [4, 5, 6]]
3 b = a
4 c = copy.copy(a)
5 d = copy.deepcopy(a)
7 a.append(15)
8 a[1][2] = 10
9 a[0] = 0
11 print a
12 print b
13 print c
14 print d
16 print id(a)
17 print id(b)
18 print id(c)
19 print id(d) 输出
1 [0, [1, 2, 10], [4, 5, 6]]
2 [0, [1, 2, 10], [4, 5, 6]]
3 [1, [1, 2, 10], [4, 5, 6]]
4 [1, [1, 2, 3], [4, 5, 6]]
5 38023496
6 38023496
7 36700104
8 38023368 再如
1 print 'a[1]',id(a[1])
2 print 'b[1]',id(b[1])
3 print 'c[1]',id(c[1])
4 print 'd[1]',id(d[1]),'\n'
6 print 'a[0]',id(a[0])
7 print 'b[0]',id(b[0])
8 print 'c[0]',id(c[0])
9 print 'd[0]',id(d[0]) 输出
1 a[1] 39654856
2 b[1] 39654856
3 c[1] 39654856
4 d[1] 39704904
6 a[0] 34112864
7 b[0] 34112864
8 c[0] 34112834
9 d[0] 34112840
简而言之:
变量直接赋值:新变量本身及其内部的元素都与原变量指向相同的内存空间,并且值相同,当一个发生变化时,另一个也随之变化。
变量浅拷贝:新变量本身与原变量指向不同的内存空间,但是新变量内部的元素与原变量指向相同的内存空间;当改变原变量内部的可变对象的值时,新变量内部的值也发生随之变化;改变原变量内部的不可变对象的值时,新变量内部的值不随之变化;反之亦然(即改变新变量时)。
变量深拷贝:新变量与原变量本身及其内部元素都指向不同的内存空间,改变原变量的值时,新变量中的值不会发生变化,反之亦然。
 
 
 
参考:http://blog.csdn.net/u013573813/article/details/53349798

python变量、引用、拷贝之间的关系的更多相关文章

  1. python 变量引用

    最近在看<<流畅的python>>关于变量引用部分时,有一些自己的看法,就再次记录一下. 问题: # From flunet python example 8-8 class ...

  2. python 类与类之间的关系. 特殊成员

    一.类与类之间的关系 1.依赖关系 在方法的参数位置把另一个类的对象作为参数进行传递 class Person: def play(self, tools): # 通过参数的传递把另一个类的对象传递进 ...

  3. python 类与类之间的关系

    一.依赖关系(紧密程度最低) (1)简单的定义:就是方法中传递一个对象.此时类与类之间存在依赖关系,此关系比较低. (2)实例植物大战僵尸简易版 题目要求:创建一个植物,创建一个僵尸 1.植物:名字. ...

  4. python之类与类之间的关系

    在我们的世界中事物和事物之间总会有一些联系.   在面向对象中. 类和类之间也可以产生相关的关系 1. 依赖关系 执行某个动作的时候. 需要xxx来帮助你完成这个操作. 此时的关系是最轻的. 随时可以 ...

  5. 浅谈javaScript数据类型、变量、内存之间的关系,文末有图解

    一.变量是没有类型的 在JavaScript中,定义变量的方法是“var 变量名=变量值”,无论这个变量要给他赋值为一个数字.字符串还是数组,他的类型都不需要声明.也就是说如果我只声明了一个变量“va ...

  6. Python变量引用

    >>>a=3 >>>b=a >>>a=4 >>>b >>>3 >>>List1=[1,2,3 ...

  7. python包管理工具他们之间的关系

    python包管理工具之间的关系 现在的python包管理工具有很多,非常混乱,必须理清他们之间的关系才能更好的使用python构建强大的包关系系统工具. 首先:python官方推荐的第三方库是PyP ...

  8. js中数据、内存、变量的概念及三者之间的关系

    目录 数据.内存.变量的概念及三者之间的关系 什么是数据 数据的特点 什么是内存 栈内存 堆内存 JS引擎如何管理内存 什么是变量 变量是普通类型时 变量是引用类型时 数据.内存.变量的三者之间的关系 ...

  9. python学习(九)python中的变量、引用和对象的关系

    <Think In Java>中说到过"万事万物皆对象",这句话也可以用在Python中. 感觉Python中的变量有点像Javascript中的变量,是弱类型的,但是 ...

随机推荐

  1. linux vim 命令使用

    基本上vim可以分为三种状态,分别是命令模式(command mode).插入模式(Insert mode)和底行模式(last line mode) 模式切换方法 在命令模式输入“i”,进入插入模式 ...

  2. python之csv操作问题

    注意注意 写入csv文件 一定要注意 [ ] fileObj = open("fileName","w+") file = csv.writer(fileObj ...

  3. 【sklearn】from sklearn.extermals import joblib(保存模型和加载模型)

    原创博文,转载请注明出处! sklearn中保存和加载模型的方法 1.载入模块 from sklearn.externals joblib. model = joblib. # -*- coding: ...

  4. Mysql 分组查询最高分

    今天告诉我要写一个服务,目的是按照每个班中各分组中竞赛最高分组平分小组得分给各个成员的服务,于是就有两个技术需求 1 查询每个班的冠军团队 2 增加一组人的分数 从“1”中,查出每个班N个分组中的得分 ...

  5. BZOJ2342 Shoi2011 双倍回文 【Manacher】

    BZOJ2342 Shoi2011 双倍回文 Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输 ...

  6. 20179223《Linux内核原理与分析》第十一周学习笔记

    缓冲区溢出漏洞实验 一.实验简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和 ...

  7. webdriver元素定位

    #1 通过id定位 driver.find_element_by_id("pop_setting_save").click() #2 通过name定位 driver.find_el ...

  8. NET Core 2.2

    .NET Core 2.2 新增部分功能使用尝鲜 https://www.cnblogs.com/viter/p/10070248.html 前言     美国当地时间12月4日,微软2019开发者大 ...

  9. Linq 分组(group by)后列变行

    表一: 表二: 已知表一的List,想得到表二的结果: var query = from c in t.AsEnumerable() group c by new { pingming = c.Fie ...

  10. Unit04: 实战技巧 、 登录

    Unit04: 实战技巧 . 登录 使用注解方式简化Unit04的小程序. 1. 基于注解的springmvc应用程序的开发 (1)编程步骤 step1. 导包. step2. 添加spring配置文 ...