通过反复试验,我发现了
my_list = range(10)
my_list[:None] == my_list[:]
我将它用于django查询集,因此我可以定义一个大小或全部:
some_queryset[:length if length else None]
# @IanAuld
some_queryset[:length or None]
# @Bakuriu
# length works for all numbers and None if you want all elements
# does not work with False of any other False values
some_queryset[:length]
None
这是一种好习惯吗? 答案 0 :(得分:20)
是的,可以使用None
,因为它的行为由documentation指定:
从i到j的s的片被定义为具有索引k的项的序列,使得i <= k <1。学家如果i或j大于len(s),则使用len(s)。如果省略i或None,则使用0. 如果省略j或None,则使用len(s)。如果i大于或等于j,则切片为空。
对其中一个切片参数使用None
与省略它相同。
答案 1 :(得分:6)
你的方式很好,但我会更喜欢:
some_queryset[:length] if length else some_queryset
或
some_queryset[:length] if length else some_queryset[:]
可读性较少,不知道切片如何处理这些特殊情况。
答案 2 :(得分:4)
应该是安全的。在Python中,something[<sliceexpr>]
相当于something[slice(...)]
,slice
类型的文档清楚地表明停止和步骤的参数默认为None
。
答案 3 :(得分:3)
使用None
或使用[:]
之类的空切片没有区别,但如果您想在列表推导中使用它或在条件下使用它,则使用None
非常有用切片,例如:
>>> [my_list[:length if length%2==0 else None] for length in [1,2,3]]
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
来自CPython
来源about slice function中的评论:
返回具有给定值的新切片对象。 开始, stop , step 参数用作相同名称的切片对象属性的值。任何值都可能是 NULL ,在这种情况下,
None
将用于相应的属性。如果新对象不能,则返回 NULL 分配。