[Learning Python] Chapter 6: The Dynamic Typing Interlude

1, 在Python中,类型永远跟随object,而非variable。Variable没有类型。程序员

2,在下面的三个式子中,a首先被赋予整形3,再被赋予字符串‘spam’,后再被赋予float型数值1.23. 这在Python中是可行的,而在C语言中不行。spa

>>> a = 3 # It's an integer
>>> a = 'spam' # Now it's a string
>>> a = 1.23 # Now it's a floating point

3,在Python中,variable和object的这种关系称为引用(reference):code

clipboard.png

每一次a被赋予一个新的值,这个箭头就被指向新的object。对象

4,每个object除了有足够的内存空间来存储它的值,还有2个标题字段(header fields):
A,type designator用来标记这个object的类型
B,reference counter 用来肯定是否能够回收这个object了。
好比,3这个object内的type designator就告诉Python,其类型是integer。ip

5,Python能够对对象进行自动地回收。这就是reference counter作的事情。若是指向这个object的reference个数为零,这个object就被马上回收。因此,程序员无需本身对其回收。如上面的a,当其被从3,指向字符串‘spam’的时候,若是3没有在被其余的variable所引用,3这个object将当即被Python回收。既其reference counter 从 1 降至0.内存

6,share reference: 以下的代码表示object 3被a和b同时引用了:字符串

clipboard.png

若是a被从新赋值为‘spam’,则表示a的引用变成新的object,即‘spam’,而b仍然指向3这个object。这告诉咱们,b不是指向a,而是指向object。全部的variable都不是指向variable,而是指向object。string

7,share reference and in-place changes.
何为in-place changes ? in-place changes 指的是针对mutable类型的type,是能够对其修改内容的,包括:dictionary、list、set。改变这种type的某个位,并非构造一个新的object,而是修改原先的object。以下,这种状况的发生表示L2随L1改变了,programmer应该意识到这个问题。it

>>> L1 = [2, 3, 4] # A mutable object
>>> L2 = L1 # Make a reference to the same object
>>> L1[0] = 24 # An in-place change
>>> L1 # L1 is different
[24, 3, 4]
>>> L2 # But so is L2!
[24, 3, 4]

8,若是不想影响L2,则应该将原本的L1复制一份,在让L2指向这个复制的object。
对于list,能够用切片的方法复制以个新的list。io

>>> L1 = [2, 3, 4]
>>> L2 = L1[:] # Make a copy of L1 (or list(L1), copy.copy(L1), etc.)
>>> L1[0] = 24
>>> L1
[24, 3, 4]
>>> L2 # L2 is not changed
[2, 3, 4]

而set、dictionary没有切片的方法,则须要用copy的方法,固然,copy一样适用于list:

import copy
X = copy.copy(Y) # Make top-level "shallow" copy of any object Y
X = copy.deepcopy(Y) # Make deep copy of any object Y: copy all nested parts

9, == 表明值相同则返回True,不然,返回False。
is表明引用相同则返回True,不然,返回Flase。这个判断会更加严格。is的值为True的两个量,其==一定也是True。

>>> L = [1, 2, 3]
>>> M = [1, 2, 3] # M and L reference different objects
>>> L == M # Same values
True
>>> L is M # Different objects , L 和M 指向了不一样的object。
False

10,因为Python会存储一些小的integer和小的string以方便从新利用。故有些时候,本该被回收的object(小的integer或者小的string)并无被及时地回收,而是仍然存储在内存里。

>>> X = 42
>>> Y = 42 # Should be two different objects
>>> X == Y
True
>>> X is Y # Same object anyhow: caching at work!
True
相关文章
相关标签/搜索