总结:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
附加:
当对象中存在指针成员时,除了在复制对象时需要考虑自定义拷贝构造函数,还应该考虑以下两种情形:
1.当函数的参数为对象时,实参传递给形参的实际上是实参的一个拷贝对象,系统自动通过拷贝构造函数实现;
2.当函数的返回值为一个对象时,该对象实际上是函数内对象的一个拷贝,用于返回函数调用处。
L1 = ['a','b','c']
L2 = L1
L3 = L1[:]
print('L1=',L1)
print('L2=',L2)
print('L3=',L3)
L1= ['a', 'b', 'c']
L2= ['a', 'b', 'c']
L3= ['a', 'b', 'c']
L1.append('d')
print('L1=',L1)
print('L2=',L2)
print('L3=',L3)
//输出如下:
L1= ['a', 'b', 'c', 'd']
L2= ['a', 'b', 'c', 'd']
L3= ['a', 'b', 'c']
L3.append('e')
print('L1=',L1)
print('L2=',L2)
print('L3=',L3)
//输出如下:
L1= ['a', 'b', 'c', 'd']
L2= ['a', 'b', 'c', 'd']
L3= ['a', 'b', 'c', 'e']
L2.remove('a')
print('L1=',L1)
print('L2=',L2)
print('L3=',L3)
//输出如下:
L1= ['b', 'c', 'd']
L2= ['b', 'c', 'd']
L3= ['a', 'b', 'c', 'e']
牛客网上的一道题:
a=[1,2,3]
b=a
b[:] = [x+1 for x in a]
print (a, b)
b = [x-1 for x in a]
print (a, b)
//输出如下:
[2, 3, 4] [2, 3, 4]
[2, 3, 4] [1, 2, 3]
需要注意的是啊,就是啊,有只小黄故意捣乱,说为啥如下的代码,我对b=a值直接赋值之后,应该按照你上面说的 ''b和a指向同一个内存,任意一方改变时,另一方也会改变'' ,那为啥,我对b重新赋值之后,输出的a 没有变化。原因是:因为你对整个b变量全部重新赋值,其实此时是:把b指向了一个存放着[1,2,3,4]列表的内存的地方,a和b指向的内存已经不是一个内存了。
a=[1,2,3]
b=a
print (a, b)
b=[1,2,3,4]
print (a, b)
//输出如下:
[1, 2, 3] [1, 2, 3]
[1, 2, 3] [1, 2, 3, 4]