Python里,万物皆为对象,当您输入或者写好一个Python的HelloWorld程序的时候,你已经在创造了属于这个World的一个甚至多个对象了。
虽然,Python提供了很好的内存管理机制,但是,作为一个好的理解,我们仍然需要弄清楚一些细节,就比如下面这个。
如果您已经键入了以上代码,那么可以发现这样一个事实,每个Python对象仍然需要我们注意它的不同之处,那就是内存地址。当我们写"b=a"时,实际上是相当于java的引用计数+1,即有两个名称引用了一个对象实例,用id()内建函数可以发现a和b的地址是一样的。因此,不仅a==b返回True,而且a就是b(“a is b”亦返回True)。
而通过列表的复制操作得到的新对象c,那可真是一个新的东西,虽然内容和a一样的,但地址是不一样的,是两个不同的对象。因此“a==b”返回True,而“a is b”返回False。
虽然,Python提供了很好的内存管理机制,但是,作为一个好的理解,我们仍然需要弄清楚一些细节,就比如下面这个。
>>> a=['eye','nose','mouth','ear','throat']
>>> b=a
>>> c=a[0:]
>>> print a
['eye', 'nose', 'mouth', 'ear', 'throat']
>>> print b
['eye', 'nose', 'mouth', 'ear', 'throat']
>>> print c
['eye', 'nose', 'mouth', 'ear', 'throat']
>>> a==b
True
>>> a==c
True
>>> a is b
True
>>> a is c
False
如果您已经键入了以上代码,那么可以发现这样一个事实,每个Python对象仍然需要我们注意它的不同之处,那就是内存地址。当我们写"b=a"时,实际上是相当于java的引用计数+1,即有两个名称引用了一个对象实例,用id()内建函数可以发现a和b的地址是一样的。因此,不仅a==b返回True,而且a就是b(“a is b”亦返回True)。
而通过列表的复制操作得到的新对象c,那可真是一个新的东西,虽然内容和a一样的,但地址是不一样的,是两个不同的对象。因此“a==b”返回True,而“a is b”返回False。