赞
踩
Python中string、tuple和number是不可变对象,而dict、list等是可变对象。
不可变对象在进行重新赋值的时候,实际上是将原始值丢弃,将变量指向一个新的值;
可变对象的可变性实质上是指更改可变对象中的子对象,比如ist中的item元素的更改。
直接赋值:其实就是对象的引用(别名),只是形成2个变量,实际上还是指向同一个对象。
eg:
- #直接赋值
- a = [1,2,3]
- b = a
- print(id(a)) #通过id查看变量在内存中的地址
- print(id(b))
-
- a[0] = 5 #修改的是a
- print(a)
- print(b)
python拷贝一般都是浅拷贝,拷贝时,只拷贝父对象,不会拷贝对象的内部的子对象,因此,源对象与拷贝对象会引用同一个子对象。
eg:
- # 浅拷贝
- a = [1,2,3]
- b = [11,22,33]
- c = [111,222,333]
-
- list01 = [a,b,c]
- print(id(list01))
- list02 = list01[:]
- #查看list01 和 list02
- print(list01)
- print(list02)
- print('_'*20)
- #检查list01 和 list02 在内存中的地址
- print(id(list01))
- print(id(list02))
-
- #修改一下
- a[0] = 5
- # print(a)
- print(list01)
- print(list02)
使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同。
eg:
- #深拷贝
- import copy
- a = [1,2,3]
- b = [11,22,33]
- c = [111,222,333]
-
- list01 = [a,b,c]
- print(id(list01))
-
- #赋值
- list02 = copy.deepcopy(list01)
- #查看list01 和 list02
- print(list01)
- print(list02)
- print('_'*20)
- #检查list01 和 list02 在内存中的地址
- print(id(list01)) #
- print(id(list02)) #
-
- #修改一下
- a[0] = 5
- # print(a)
- print(list01)
- print(list02)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。