1.赋值
Python 中,对象的赋值就是简单的对象引用
a = [1,2,"hello",['python', 'C++']]
b = a
他们指向同一片内存,b 不过是 a 的别名,是引用
2.我们可以使用 b is a 去判断,返回 True,表明他们地址相同,内容相同,也可以使用 id()函数来查
看两个列表的地址是否相同.
赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了对象的引用。也就是
说除了 b 这个名字之外,没有其他的内存开销。修改了 a,也就影响了 b,同理,修改了 b,也就影响
了 a。
二、浅拷贝(copy.copy)
是拷贝了一份和原来一样的的变量 ,但是他们指向的是不同的内存地址 ,虽说如此 ,浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。
我们举个例子
a=[1,2]
b=[3,4]
l=[a,b]
#如果我们浅拷贝了一份 l 那么新的变量是否就是 l呢
import copy
l2=copy.copy(l)
print(l2 is l )
>>>flase
#当然是否定的
当我们在a里添加了一个时
a.append(0)
print(l)
print(l2)
会发现l,l2都变了 所以 浅拷贝的第一层是对象的应用
我们在1之后添加一个索引 会发现不影响l2
import copy
l2=copy.copy(l)
l.append(3)
print(l2)
切片后赋值 ,list copy方法都是浅拷贝
三深拷贝
那我们再看下深拷贝
import copy
l2=copy.deepcopy(l)
print(l[0] is a )#True
print(l2[0] is a )#False
总结 :浅拷贝和深拷贝
如果被拷贝的类型是可变类型 比如列表
copy 是浅拷贝,decopy的深拷贝
如果被拷贝类型是不可变类型分为两种情况 (a,b)
1.里面那一层 如果是不可变的 那么copy 是引用,deepcopy也是引用 (1,2)
2.里面那一层 如果是可变的 copy 是引用 ,deepcopy是深拷贝 ([1],[2])