python变量、引用、拷贝之间的关系
Python中一切皆为对象,不管是集合变量还是数值型or字符串型的变量都是一个引用,都指向对应内存空间中的对象。
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
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
python变量、引用、拷贝之间的关系的更多相关文章
- python 变量引用
最近在看<<流畅的python>>关于变量引用部分时,有一些自己的看法,就再次记录一下. 问题: # From flunet python example 8-8 class ...
- python 类与类之间的关系. 特殊成员
一.类与类之间的关系 1.依赖关系 在方法的参数位置把另一个类的对象作为参数进行传递 class Person: def play(self, tools): # 通过参数的传递把另一个类的对象传递进 ...
- python 类与类之间的关系
一.依赖关系(紧密程度最低) (1)简单的定义:就是方法中传递一个对象.此时类与类之间存在依赖关系,此关系比较低. (2)实例植物大战僵尸简易版 题目要求:创建一个植物,创建一个僵尸 1.植物:名字. ...
- python之类与类之间的关系
在我们的世界中事物和事物之间总会有一些联系. 在面向对象中. 类和类之间也可以产生相关的关系 1. 依赖关系 执行某个动作的时候. 需要xxx来帮助你完成这个操作. 此时的关系是最轻的. 随时可以 ...
- 浅谈javaScript数据类型、变量、内存之间的关系,文末有图解
一.变量是没有类型的 在JavaScript中,定义变量的方法是“var 变量名=变量值”,无论这个变量要给他赋值为一个数字.字符串还是数组,他的类型都不需要声明.也就是说如果我只声明了一个变量“va ...
- Python变量引用
>>>a=3 >>>b=a >>>a=4 >>>b >>>3 >>>List1=[1,2,3 ...
- python包管理工具他们之间的关系
python包管理工具之间的关系 现在的python包管理工具有很多,非常混乱,必须理清他们之间的关系才能更好的使用python构建强大的包关系系统工具. 首先:python官方推荐的第三方库是PyP ...
- js中数据、内存、变量的概念及三者之间的关系
目录 数据.内存.变量的概念及三者之间的关系 什么是数据 数据的特点 什么是内存 栈内存 堆内存 JS引擎如何管理内存 什么是变量 变量是普通类型时 变量是引用类型时 数据.内存.变量的三者之间的关系 ...
- python学习(九)python中的变量、引用和对象的关系
<Think In Java>中说到过"万事万物皆对象",这句话也可以用在Python中. 感觉Python中的变量有点像Javascript中的变量,是弱类型的,但是 ...
随机推荐
- SQL Server插入或修改数据是中文乱码的问题
SQL Server中乱码解决方案: 在Sql Server2005英文版中,如果未对Varchar类型的字段进行设置,那么很多朋友会发现向数据库中插入记录时,如果对应的varchar类型字段 的值为 ...
- wait() ,notify() ,notifyAll(),synchronized 和同步方法锁,对象锁的联系,关系,区别;
一直不明白一个问题,因为在书上关于生产者和消费者的例子里看到一段这样的代码,估计很多人都和我一样迷惑 public synchronized void set(String name, String ...
- Windows中cmd操作mysql
打开CMD 将工作目录切换到MySQL的bin下 mysql -u root -p 输入密码即可登陆MySQL 问号可以查看帮助 首先需要选择操作的数据库use database_name 然后可以进 ...
- tomcat错误:The page you tried to access (/manager/login.do) does not exist
今天在idea上跑一个项目,所有配置都正常,其他接口测试也正常.唯独“/manage/user”接口在测试的时候后台没反应,也就是程序根本没往下走,postman测试显示如下: 浏览器范围url连接显 ...
- BZOJ4128 Matrix 【BSGS】
BZOJ4128 Matrix Description 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) Input 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * ...
- 如何通过eclipse查看、阅读hadoop2.4源码
问题导读:1.官网src包下载包,能否直接使用?2.如何跟踪和查看hadoop源码? 此篇是从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码基础上的一个继续,上文其 ...
- C++ set容器
STL中的set容器的一点总结:(元素唯一,且排序) 1.关于set (头文件:<set>) C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, strin ...
- 转:Excel导入SQL数据库完整代码
Excel导入SQL数据库完整代码 protected void studentload_Click(object sender, EventArgs e) {//批量添加学生信息 SqlConnec ...
- 如何批处理多个MySQL文件
@echo off CHCP 65001 --设置cmd编码for %%i in (E:\sql\*.sql) do ( --多个MySQL SQL文件的存放目录echo excute %%i ...
- ORACLE 12C RMAN 功能增强
在ORACLE 12C中对rman的功能有了不少增强,在以前的文章中写过RMAN RECOVER TABLE功能,这里另外补充rman增强的两个小功能(sql语句和数据文件分割)数据库版本 SQL&g ...