如下两段代码:
代码1:
aa = [[1, 2], [2, 3], [3, 4]]
qq = aa[0]
qq[1] = 0
print(aa)#[[1, 0], [2, 3], [3, 4]]#aa被改变了
代码2:
aa = [[1, 2], [2, 3], [3, 4]]
qq = aa[0]
qq = [8, 8]
print(aa)#[[1, 2], [2, 3], [3, 4]]#aa没有被改变
为何代码1中aa被改变了?qq获得的是值拷贝还是引用?
代码 2 中,
(1)"qq=aa[0]" 直接赋值,默认浅拷贝传递对象的引用。
(2)"qq = [8, 8]",相当于对 qq 重新进行定义并赋值,而不是指针传递,因此 aa 没有改变。
因为代码1里面的qq这个变量和aa[0]的地址一样,所以改变qq就是改变aa[0]
qq=aa[0]表示令qq指向的地址等于aa[0]指向的地址
而代码2中,qq跟aa没有关联,所以aa不会改变
代码1 中 "qq=aa[0]" 是 浅拷贝。
在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。
"qq=aa[0]" 直接赋值,默认浅拷贝传递对象的引用。 "qq【1】=0" 被赋值的浅拷贝改变,原始列表也会做相同的改变。