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