标签:地方 运行 可变 动态类型 使用 另一个 替换 现象 垃圾回收机制
动态类型:
在python中,类型是在运行过程中自动决定的,而不是通过代码声明的。
变量:
变量是一个系统表的元素,拥有指向对象的连接的空间
python中,类型的概念是存在于对象中的,而不是变量中,变量是通用的。
变量的使用:
当变量出现在表达式中时,它会马上被当前引用的对象所代替,无论这个对象是什么类型。
并且所有变量使用前必须先赋值。
例子:
a=3
1.分配一块内存来表示对象3;
2.创建一个变量a;
3.将变量和对象3连接起来;
对象:
1.对象时被分配的一块内存,有足够的空间去表现他们所代表的值。
2.对象=值+头部信息。头部信息有两个:一个是类型标志符,一个是引用的计数器。
3.对于小的整数和字符串,Python会缓存并复用(即创建一个42,如果对象42的引用计数器为0了,它不会马上回收垃圾,而是短暂存在一个地方,等待其他变量引用)
对象的垃圾回收机制:
当一个对象身上的引用计数器为0时,会被自动回收
共享引用:
在Python中,给一个变量赋新值,并不是替换了原始的对象,而是让这个变量去引用另一个新对象。
不可变类型:
a=3
b=a
a=a+2
1.创建对象3,变量a引用对象3;
2.正如前面所说,当变量出现在表达式中时,它会马上被当前引用的对象所代替,无论这个对象是什么类型。
所以b=a时,直接替换成b=3,此时a和b共同引用了对象3;
3.同2,a=a+2直接看成a=3+2=5,此时a引用了新的对象5,而b还是引用对象3.
可变类型:
a1=[1,2,3]
a2=a1
a1[0]=4
执行a1[0]=4这句时,因为列表是可变的,所以对象[1,2,3]直接在原处修改成[4,2,3],此时a1,a2的应用并没有变,
所以a1修改,a2也变了。
(如果不想要这种现象发生,就需要Python拷贝对象,而不是创建引用,比如从头到尾的分片a2=a1[:],(如果是字典就用对象.copy()),
此时a1改变,a2还不变,因为a2=a1[:],a1,a2 并不是引用通一份对象,而是另外复制一份新的对象[1,2,3],然后让a2引用它
)
标签:地方 运行 可变 动态类型 使用 另一个 替换 现象 垃圾回收机制
原文地址:http://www.cnblogs.com/yangyongbo/p/7276966.html