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. onerror="javascript:this.src='images/defaultUpload.png';"【容易导致死循环报错】

    当无法找到默认图片时,onerror="javascript:this.src='images/defaultUpload.png';"容易导致死循环报错

  2. DependencyProperty.UnsetValue 的正确打开方式

    无论是 WPF,还是 UWP,只要你用了绑定或者标记扩展,一定会碰到一个神奇的值——DependencyProperty.UnsetValue.UnsetValue 是什么意思?为什么会出现这个值呢? ...

  3. 集群搭建SSH的作用及这些命令的含义

    authorized_keys文件 远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中.公钥就是一段字符串,只要把它追加在authorized_ ...

  4. oracle-分区(笔记)

    partition by 用于指定分区方式 range 表示分区的方式是范围划分 partition pn 用于指定分区的名字 values less than 指定分区的上界(上限) ------- ...

  5. 《selenium2 python 自动化测试实战》(10)——下拉框和alert

    # coding: utf-8 from selenium import webdriverfrom selenium.webdriver.common.action_chains import Ac ...

  6. elixir 使用mix umbrella 模块化项目

    备注: 项目比较大, 模块比较多,一般使用mix 的方式是大家进行文件夹的划分,但是使用mix 的umbrella 可能会更方便 1. 安装 默认安装elixir 的时候已经包含了这个功能 2. 基本 ...

  7. Serf 了解

    Introduction to Serf Welcome to the intro guide to Serf! This guide will show you what Serf is, expl ...

  8. Python学习系列(九)(IO与异常处理)

    Python学习系列(九)(IO与异常处理) Python学习系列(八)( 面向对象基础) 一,存储器 1,Python提供一个标准的模块,称为pickle,使用它既可以在一个文件中存储任何Pytho ...

  9. linux中控操作相关

    1.首先生成无密码登陆密钥 一般使用rsa 2.编写shell脚本 work_dir=$(pwd) 3.远程拷贝 work_dir=$(pwd) ..} do ¥{host_prefix}$i:$ e ...

  10. B-tree & B+tree & B*Tree 结构浅析——转

    转自http://www.cnblogs.com/coder2012/p/3330311.html http://blog.sina.com.cn/s/blog_6776884e0100ohvr.ht ...