37,737
社区成员
发帖
与我相关
我的任务
分享
>>> d = [[0] * 3] * 3
>>> id(d[0])
4299827464
>>> id(d[1])
4299827464
>>> id(d[2])
4299827464
>>> md = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> id(md[0])
4299826888
>>> id(md[1])
4299787656
>>> id(md[2])
4299827392
>>>
上面这段能看明白,就知道d[0],d[1]和d[2]其实是同一个对象(浅copy),
所以d[0][:]=[1,2,3]改第0个就相当于3个对象都被修改了;
而md[0],md[1],md[2]是三个不同的对象,
md[0][:]=[1,2,3]改第0个就只改第0个对象了。
那obj1 == obj2的含义呢?
这里的==,会考察两个方面的含义:
id(obj1) == id(obj2),两个对象的id都相同,其实是同一个对象,那它们自然“相等”;
id(obj1) != id(obj2),但是它们的“内容”相等;
显然,初始的d和md就是两个“不同”的对象,因为它们的id肯定不一样,但是它们的“内容”相等,所以说它们相等,是说的过去的。
最后,d = [[0] * 3] * 3,为什么会是浅copy,而md就不是呢?
还是看文档:https://docs.python.org/2.7/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange
这里有个seq对象的operator表,里面有个note 2,解释了这个问题,解释中还有个FAQ,https://docs.python.org/2.7/faq/programming.html#faq-multidimensional-list,可以进一步去看看。
===================================
http://python.usyiyi.cn/
Volunteers WANTED