python变量、引用、拷贝之间的关系

变量和引用的关系

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

  1. 不可变对象:int,float,long,str,tuple等;

In[20]: a = 1
In[21]: b = a
In[22]: id(a)
Out[22]: 33719592L
In[23]: id(b)
Out[23]: 33719592L
In[24]: a = 2
In[25]: id(a)
Out[25]: 33719568L
In[26]: id(b)
Out[26]: 33719592L
In[27]: b = 3
In[28]: id(b)
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的值也跟着变化,它们仍
然指向同一个内存空间;


浅拷贝和深拷贝的区别

import copy
a = [1,[1, 2, 3], [4, 5, 6]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)

a.append(15)
a[1][2] = 10
a[0] = 0

print a
print b
print c
print d

print id(a)
print id(b)
print id(c)
print id(d)
[0, [1, 2, 10], [4, 5, 6]]
[0, [1, 2, 10], [4, 5, 6]]
[1, [1, 2, 10], [4, 5, 6]]
[1, [1, 2, 3], [4, 5, 6]]
38023496
38023496
36700104
38023368
print 'a[1]',id(a[1])
print 'b[1]',id(b[1])
print 'c[1]',id(c[1])
print 'd[1]',id(d[1]),'\n'

print 'a[0]',id(a[0])
print 'b[0]',id(b[0])
print 'c[0]',id(c[0])
print 'd[0]',id(d[0])
a[1] 39654856
b[1] 39654856
c[1] 39654856
d[1] 39704904 

a[0] 34112864
b[0] 34112864
c[0] 34112834
d[0] 34112840

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




  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值