在python中,类型是在运行过程中自动决定的,不是通过代码的声明。---非常重要

>>> a=666

  1. 创建一个对象来代表值666(类型的概念是存在于对象中而不是变量名中)

  2. 创建一个变量a(在赋值时创建变量)

  3. 将变量与新的对象3相连接

image.png

变量名和对象,在运行a=666后,变量a变成对象666的一个引用,在内部,变量事实上是到对象内存空间的一个指针(通过运行常量表达式666而创建)。

在python中从变量到对象的连接称作引用。引用是一种关系,以内存中的指针形式实现。

变量是一个系统表的元素,拥有指向对象的连接的空间

对象是分配的一块内存,有足够的空间存储他们所代表的值

引用是变量到对象的指针


一个对象都有两个标准的头部信息,一个类型标志符去标识这个对象的类型,一个引用计数器,用来决定是不是可以回收这个对象。


垃圾收集:

如果这个对象没有变量名引用了,python的垃圾收集机制就会回收内存。是通过这个对象的引用计数器来判断是否有引用的。


共享引用:

多个变量名引用同一个对象,称为 共享引用

        >>> a=666

        >>> b=a

        >>> a

        666

        >>> b

        666


        >>> a=666

        >>> b=a

        >>> b

        666

        >>> a='fuck'

        >>> b

        666

        >>>当赋值完fuck后,由常量表达式fuck创建了新的对象(内存空间),但变量b依然引用原始的对象666,这个赋值运算改变的不是对象3,而是改变了变量a的引用。从而变量b未改变。(并不是替换原来的对象

注:给变量赋一个新值,不是替换了原始的对象,而是让这个变量去引用完全不同的一个对象。


共享引用和在原处修改,以下是列表

        >>> L1=[1,2,3,4]

        >>> L2=L1

        >>> L2

        [1, 2, 3, 4]

        >>> L1[0]=666

        >>> L1

        [666, 2, 3, 4]

        >>> L2

        [666, 2, 3, 4]

        >>>

共享引用和相等

        >>> a=1111

        >>> b=1111

        >>> a is b

        False

        >>> a==b

        True

        >>> x=999

        >>> y=x

        >>> x is y

        True

        >>> x==y

        True

其中“==”比较的是两个被引用的对象的值是否相等,而is操作符是检查对象的同一性,两个变量是否指向同一个对象。


注:例

>>> x=11

>>> x='fuck'

对象11是否立刻被python垃圾收集回收了?不会的。python缓存并服用了小的整数和小的字符串。如:

        >>> m=1111

        >>> n=1111

        >>> n is m

        False


        >>> c=11

        >>> d=11

        >>> c is d

        True           #小的整数和字符串被缓存、复用


        >>> g=1000

        >>> f=1000

        >>> g is f

        False


查询对象被引用多少次,使用sys模块的getrefcount(对象)

        >>> import sys

        >>> sys.getrefcount(11)

        20

        >>> sys.getrefcount('fuck')

        4