1.对象的赋值
都是进行对象引用(内存地址)传递,即‘’ b is a‘’ ,a 变 b 也变
2.copy.
copy
(x):浅拷贝
会创建一个新的对象,即 “b is not a” ,但是,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址),也就是说”b[i] is a[i]”
当我们使用下面的操作的时候,会产生浅拷贝的效果:
- 使用切片[:]操作
- 使用工厂函数(如list/dir/set)
- 使用copy模块中的copy()函数
alist=[1,2,3,["a","b"]]
import copy
a = copy.copy(alist)
a.append("ouyoung")
print('alist:',alist)
print('a:',a)
alist.append( '6959')
print('alist:',alist)
print('a:',a)
print( id(alist),'*****',id(a))
alist[3].append('cccc')
print('alist:',alist)
print('a:',a) # 此处 操作元数据的子对象 发生改变
**********************************************************************
alist: [1, 2, 3, ['a', 'b']]
a: [1, 2, 3, ['a', 'b'], 'ouyoung']
alist: [1, 2, 3, ['a', 'b'], '6959']
a: [1, 2, 3, ['a', 'b'], 'ouyoung']
2186852331656 ***** 2186853059016
alist: [1, 2, 3, ['a', 'b', 'cccc'], '6959']
a: [1, 2, 3, ['a', 'b', 'cccc'], 'ouyoung']
3.copy.
deepcopy
(x[, memo]):深拷贝
会创建一个新的对象,即”b is not a” ,并且 对于对象中的元素,深拷贝都会重新生成一份(有特殊情况,下面会说明),而不是简单的使用原始元素的引用(内存地址)
拷贝的特殊情况
其实,对于拷贝有一些特殊情况:
- 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有拷贝这一说
- 如果元祖变量只包含原子类型对象,则不能深拷贝
alist=[1,2,3,["a","b"]]
import copy
a = copy.deepcopy(alist)
a.append("ouyoung")
print('alist:',alist)
print('a:',a)
alist.append( '6959')
print('alist:',alist)
print('a:',a)
print( id(alist),'*****',id(a))
alist[3].append('cccc')
print('alist:',alist)
print('a:',a) # 此处 操作元数据的子对象 没有发生改变
***********************************************************
alist: [1, 2, 3, ['a', 'b']]
a: [1, 2, 3, ['a', 'b'], 'ouyoung']
alist: [1, 2, 3, ['a', 'b'], '6959']
a: [1, 2, 3, ['a', 'b'], 'ouyoung']
2186853059016 ***** 2186853493960
alist: [1, 2, 3, ['a', 'b', 'cccc'], '6959']
a: [1, 2, 3, ['a', 'b'], 'ouyoung']