我偶然发现UserList
的实现,似乎不明白为什么在__init__()
方法中,切片分配和正常分配都用于设置给定的初始列表。这是code:
class UserList(collections.MutableSequence):
def __init__(self, initlist=None):
self.data = []
if initlist is not None:
# XXX should this accept an arbitrary sequence?
if type(initlist) == type(self.data):
self.data[:] = initlist
elif isinstance(initlist, UserList):
self.data[:] = initlist.data[:]
else:
self.data = list(initlist)
为什么在分配初始列表时会使用self.data[:]
和self.data
?
答案 0 :(得分:2)
你是对的,代码是多余的。但它不是在2000年的Jeremy Hylton made the change。
现在切片分配采用任何序列类型,但该功能仅在Python 2.3中添加(具体来说,是Alex Martelli added support for any type to be used)。
因此,在编写代码时,使用切片分配而不是创建新的列表对象是完全合理的,但前提是您有一个实际可以在右侧使用的对象作业。切片分配是一种快速有效的复制列表内容的方法。