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中的变量,是弱类型的,但是 ...
随机推荐
- Vue Devtools--vue调式工具
当浏览器控制台出现:Download the Vue Devtools extension for a better development experience: 1:安装 地址:https://g ...
- rest-framework框架 -- 认证权限流程源码
认证权限 解析BaseAuthentication源码 # 做认证权限 from rest_framework import exceptions from ..models import * cla ...
- SVM处理多分类问题(one-versus-rest和one-versus-one的不同)
SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器. 目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一 ...
- c++学习笔记(4)
1.non-virtual函数是在编译时完成解析的,根据该对象被调用时的类型来判断!!切记这点. 2.凡基类定义有一个(或多个)虚函数,应该要将其destructor声明为virtual,但不要把de ...
- Spark执行样例报警告:WARN scheduler.TaskSchedulerImpl: Initial job has not accepted any resources
搭建Spark环境后,调测Spark样例时,出现下面的错误:WARN scheduler.TaskSchedulerImpl: Initial job has not accepted any res ...
- VScode插件
Visual Studio Code (简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮.智能代码补全.自定义热键.括号匹配.代码片段. ...
- POJ1220 Number Base Conversion
题意 Write a program to convert numbers in one base to numbers in a second base. There are 62 differen ...
- 如何将angular-ui-bootstrap的分页组件封装成一个指令
准备工作: (1)一如既往的我还是使用了requireJS进行js代码的编译 (2)必须引入angualrJS , ui-bootstrap-tpls-1.3.2.js , bootstrap.css ...
- VS2010 无法启动程序,系统找不到指定的文件
1>------ 已启动生成: 项目: work, 配置: Debug Win32 ------1>生成启动时间为 2018/1/9 14:01:16 下午.1>Initialize ...
- JAVA Debug 调试代码
JAVA Debug 调试代码 1.什么时候使用Debug: 程序的运行结果,与你的预期结果不同时,Debug的目的是找错误,而不是该错误: 2.早期调试代码的方式就是打桩: System.out.p ...