python里面的引用

1 对象及其引用

python中,引用是用命名空间来实现的,命名空间维护了变量和对象之间的引用关系。

1 myInt = 27
2 yourInt = myInt
3 
4 #change the value of yourInt
5 yourInt = yourInt + 5

改变值的过程中,命名空间快照如下:

  、

如上图所示,每个不可变对象的操作都将创建指向新对象的引用。

对于可变对象,情况会不一样。

1 list1 = [1, 2, 3]
2 list2 = list1
3 
4 #list1 append a new element
5 list1.append(4)
6 
7 print(list1)
8 print(list2)

对list1的改变已经反映到了list2中,list1、list2均引用同一个对象。

 

2 深复制与浅复制

 1 >>> list1 = [1, 2, 3]
 2 >>> list2 = [4, 5, 6]
 3 >>> list1.append(list2)  #将列表2添加到列表1中
 4 >>> list1
 5 [1, 2, 3, [4, 5, 6]]
 6 >>> list3 = list2    #给这个列表另一个名字
 7 >>> list3
 8 [4, 5, 6]
 9 >>> list2 is list3
10 True
11 >>> list3[2] = 66   #重新赋值
12 >>> list3
13 [4, 5, 66]                #列表3变化,正常
14 >>> list2
15 [4, 5, 66]                 #列表2变化 ,正常
16 >>> list1
17 [1, 2, 3, [4, 5, 66]]   #列表1也变化了,神马情况

具体情况如下图:

如上,将list2加入list1时,只是复制了应用,没有复制对象本身的情况,称为浅拷贝。要复制内容,而不是简单的复制引用,称为深拷贝。

在copy模块中,有deepcopy函数,在需要时,强制进行深拷贝。

编程技巧: 对引用可变对象的变量进行操作,可能会改变对象本身或者创建一个新的对象。对引用不可变对象的变量进行操作,

只会创建新的对象

 

posted @ 2013-10-29 17:35  tianxiaozz  阅读(386)  评论(0编辑  收藏  举报