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
每一次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同时引用了:字符串
若是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