python动态类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python动态类型相关的知识,希望对你有一定的参考价值。
在python中,类型是在运行过程中自动决定的,不是通过代码的声明。---非常重要
>>> a=666
创建一个对象来代表值666(类型的概念是存在于对象中而不是变量名中)
创建一个变量a(在赋值时创建变量)
将变量与新的对象3相连接
变量名和对象,在运行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
以上是关于python动态类型的主要内容,如果未能解决你的问题,请参考以下文章