list = sorted(set(list))
list[:] = sorted(set(list))
list[::] = sorted(set(list))
我是Python的新手,我注意到的第一件事是语法简洁,但不明显。
例如,目前尚不清楚上述三个陈述中发生了什么。我运行它们并获得了一些结果,似乎语句1没有更新列表,而语句2和语句3是。但是,我相信还有更多的事情要发生。
上述每项任务的含义是什么?
答案 0 :(得分:3)
2和3执行相同操作(切片的step
参数是可选的,并且这两个切片都使用step
的默认1
),但它们本身都与1.切片分配(lst[:] = ...
)改变原始对象,而常见作业(lst = ...
)将变量重新绑定到新对象。
>>> lst = [3,3,2,2,1,1]
>>> id(lst)
139793325565704
>>> lst[:] = sorted(set(lst))
>>> lst
[1, 2, 3]
>>> id(lst)
139793325565704 # same object
>>> lst = sorted(set(lst))
>>> id(lst)
139793325524744 # different object
值得注意的是,切片赋值可以在rhs上具有任何可迭代(对于部分切片,它们的元素数必须与切片的长度匹配):
>>> lst = [1,2,3]
>>> lst[1:] = 'ab'
>>> lst
[1, 'a', 'b']
有关详细信息,请参阅the slice docs中的一些内容。