在内部,这是一个很大的区别:>>>a = [3, 2]
>>>a[0:1][0] = 1
是
^{pr2}$
内部表示为a.__getitem__(slice(0, 1)).__setitem__(0, 1)
责任。在temp = a.__getitem__(slice(0, 1))
temp.__setitem__(0, 1)
所以它访问列表的一部分,创建一个单独的对象,并对这个对象执行赋值,然后将其删除。在
奥托>>>a[0:1] = [1]
是的a.__setitem__(slice(0, 1), [1])
只对原始对象进行操作。在
所以,虽然看起来很相似,但这些表达方式的意思是不同的。在
让我们来测试一下:class Itemtest(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return self.name
def __setitem__(self, item, value):
print "__setitem__", self, item, value
def __getitem__(self, item):
print "__getitem__", self, item
return Itemtest("inner")
a = Itemtest("outer")
a[0:1] = [4]
temp = a[0:1]
temp[0] = 4
a[0:1][0] = 4
输出__setitem__ outer slice(0, 1, None) [4]
__getitem__ outer slice(0, 1, None)
__setitem__ inner 0 4
__getitem__ outer slice(0, 1, None)
__setitem__ inner 0 4
本文链接:https://my.lmcjl.com/post/1211.html
4 评论