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)