Python 切片与普通赋值

Python 切片与普通赋值,python,list,slice,Python,List,Slice,我偶然发现了UserList的实现,似乎不明白为什么在\uuuu init\uuuu()方法中同时使用切片分配和普通分配来设置给定的初始列表。以下是: 分配初始列表时,为什么同时使用self.data[:]和self.data?您是正确的,代码是多余的。但那不是在2000年 现在slice assigment可以采用任何序列类型,但该功能只是被添加进来的(特别是Alex Martelli) 因此,在编写代码时,使用slice赋值而不是创建新的list对象是非常有意义的,但前提是您的右侧有一个对象

我偶然发现了
UserList
的实现,似乎不明白为什么在
\uuuu init\uuuu()
方法中同时使用切片分配和普通分配来设置给定的初始列表。以下是:

分配初始列表时,为什么同时使用
self.data[:]
self.data

您是正确的,代码是多余的。但那不是在2000年

现在slice assigment可以采用任何序列类型,但该功能只是被添加进来的(特别是Alex Martelli)


因此,在编写代码时,使用slice赋值而不是创建新的list对象是非常有意义的,但前提是您的右侧有一个对象可以用于此类赋值。切片分配是复制列表内容的一种快速有效的方法。

我理解。但是,如果可以不用切片赋值,为什么还要使用切片赋值,就像第三个赋值一样?@AndreiHorak:为什么要再次创建一个新的列表对象?“切片指定”可避免在此处创建新对象。当然,如果initlist现在不是其他[],那么您可以使用
self.data=list(initlist);e、 g.复制
initlist
(如果存在),否则创建一个空列表。但是,当另一种类型也是列表时,切片分配可能非常有效。
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)