第二个问题:
>>> help(id)
Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory address.)
人家说的很明白了,返回的是object的内存地址,同时存在的对象之间是独立的。
你用u"吴"的时候,和你用"吴".decode("utf8")的时候的"吴",对于python而言,
理论上时独立的,因为这是两次执行过程,并没有什么相关性,完全可以理解为
这是两个object,只是这两个str的值一样罢了,python并不保证两个值一样的object
就放在同一个内存地址内。
当然了,对于某些类型的对象,比如小int和简单ascii str,python为了优化,
会使用同样的内存地址存同样的值,但这并不保证。所以尽量不要去考虑这个。
你大可以认为,同一个生产线出来的轮子,长的再一样,它也是两个轮子,放在不同的
位置,占用不同的空间。
所以:
>>> id(u"吴")
11577488
>>> id(u"吴")
11577776
>>> id("吴")
13245696
>>> id("吴")
13650880
>>> id("吴")
13304864
>>> id("吴")
13245696
至于"=="的判断,这个并不是根据"=="的统一定义来的,而是根据每个不同的类型对于
__eq__ 这样的method的实现来的。所以并不一定说id一样就True,或者值一样就True
比如str类型,python对"__eq__"的定义是内容(也就是值)相同就返回True
所以才会有:
>>> a = '吴'
>>> b = '吴'
>>> a
'\xce\xe2'
>>> b
'\xce\xe2'
>>> id(a)
13745216
>>> id(b)
13743232
>>> id(a) == id(b)
False
>>> a == b
True
而对于基类object而言,"__eq__"就很简单了,id不同就不同
>>> x = object()
>>> y = object()
>>> x == y
False
>>> x
<object object at 0x00B20468>
>>> y
<object object at 0x00B20470>