Python列表使用None作为参数切片

时间:2015-06-03 14:20:28

标签: python list

通过反复试验,我发现了

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这是一种好习惯吗?
  • 在任何情况下,此方法都会出现问题吗?

4 个答案:

答案 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   分配。