python易误点——赋值、深浅拷贝
作者:互联网
- 赋值
举个例子
str='aaa'
str1=str
print(str is str1)
str='bbb'
print(str1)
---------------
output:
True
aaa
str=str1说明,str和str1指向同一个地址,那么为什么str改变了值之后,str1没有跟着变化呢?因为对于string这类的不可变对象,可变对象有list等,str=‘bbb’实现开辟一块地址给字符串‘bbb’然后将str指向这个地址。而str1还是指向之前存储‘aaa’的地址。这就导致了经过str=‘bbb’后,str和str1指向了不同的地址。
- 拷贝
那么如何操作才能让元素值相等但是不是指向同一个地址呢?答案就是拷贝。
浅拷贝:shallow copy,只拷贝第一层的数据。python中赋值操作或copy模块的copy()就是浅拷贝
深拷贝:deep copy,递归拷贝所有层次的数据,python中copy模块的deepcopy()是深拷贝
浅拷贝
import copy
a=[1,2,3]
aa=[1,a,3]
aa1=copy.copy(aa)
aa1 is aa (False)
aa[1] is aa1[1] (True)
深拷贝
import copy
a=[1,2,3]
aa=[1,a,3]
aa1=copy.copy(aa)
aa1 is aa (False)
aa[1] is aa1[1] (False)
我们为要注意深拷贝和浅拷贝的区别呢:因为对于像列表这样的数据结构,如果是浅拷贝,修改了两个变量指向的同一个处理相同地址的可变元素(比如list),就可能会导致没能达到拷贝的效果。这里需要注意。
例如:
import copy
a=[1,2,3]
aa=[1,a,3]
aa1=copy.copy(aa)
aa[1]=[2,2,2,2]
print(aa[1])
output:
[2,2,2,2]
标签:aa,str,python,str1,aa1,误点,拷贝,copy,赋值 来源: https://blog.csdn.net/qq_37724465/article/details/104847732