学习python首先要了解这三个的关系,变量、对象、引用、类型
这个要记住:类型存在于对象、变量通过引用链接上对象
变量在赋值的时候才创建,可以引用任何类型的对象、并且使用之前比许进行赋值。<center>
例如:
》》:a = 3
其实是完成了三个事情:1.创建了一个int类型的对象3
2.创建了一个名为a的对象
3.将变量名a与int类型的对象3相连接变量实际上是到对象内存空间的一个指针,变量是一个系统表的元素,拥有指向对象的链接空间。
对象是分配的一块内存,有足够的空间去表示他们所代表的的值
引用是自动形成的从变量到对象的指针记住:每一个对象都有两个东西,对象类型和引用的计数器 这连个东西决定了是否自动回收。
对象的垃圾回收:每个对象保持了一个引用计数器,计数器记录了当前指向该对象的引用的数目,一旦这个计数器为0,这个对象的内存空间就会被自动回收。import sys
print(sys.getrefcount(L)) 查看引用对少次共享引用
变量a引用了spam对象的内存空间,所有值钱对象3肯定是还有引用的,那么谁用呢就是变量ba = 3
b = a
a = a + 3L = [1,2,3]
L2 = L
L = 24
此时L2依然不会变,如果写下面的语句替换L=24
L[0] = 24
这样就更改了L2的值,因为列表L引用的是对象、L[0]是在原处修改了引用值,L与L2是共享引用的,所以L修改了第一个对象的引用,L2也会改变
更好的理解共享引用
第一个题:A和B最初共享与引用,但是后来B重新指向了另一个对象,所以不影响A
第二题:A和B最初共享引用,但是列表支持在原处修改,所以赋值B[0]就是在原处修改了重新指向别的地方的指针,那么A肯定也更改了,区别就在于B[0]就是在原处修改。
第三题,其实B=A[:]是创建了两个list,A和B,即创建了两个列表A,B,两个拥有相同值的不同列表对象,所以B[0]在原处修改,不会影响A