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

yam*_*amm 17 python list

通过反复试验,我发现了这一点

my_list = range(10)
my_list[:None] == my_list[:]
Run Code Online (Sandbox Code Playgroud)

我将它用于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]
Run Code Online (Sandbox Code Playgroud)
  • None切片时使用这个好习惯吗?
  • 在任何情况下,这种方法都会出现问题吗?

int*_*jay 21

是的,可以使用None,因为它的行为由文档指定:

从i到j的s的片被定义为具有索引k的项的序列,使得i <= k <j.如果i或j大于len(s),则使用len(s).如果省略i或None,则使用0. 如果省略j或None,则使用len(s).如果i大于或等于j,则切片为空.

使用None其中一个切片参数与省略它相同.


Emi*_*har 6

你的方式很好,但我更喜欢:

some_queryset[:length] if length else some_queryset
Run Code Online (Sandbox Code Playgroud)

要么

some_queryset[:length] if length else some_queryset[:]
Run Code Online (Sandbox Code Playgroud)

它们是可读的,对切片如何处理这些特殊情况知之甚少.


dee*_*ets 5

应该是安全的。在 Python 中,something[<sliceexpr>]相当于something[slice(...)],并且该slice类型的文档明确指出 stop 和 step 的参数默认为None