Por que não 'example'[999:9999]
resulta em erro? Desde então 'example'[9]
, qual é a motivação por trás disso?
A partir desse comportamento, posso assumir que 'example'[3]
é, essencialmente / internamente, diferente de 'example'[3:4]
, embora ambos resultem na mesma 'm'
string.
[999:9999]
não é um índice, é uma fatia e tem semânticas diferentes. Da introdução do python: "Índices de fatia degenerados são tratados com elegância: um índice muito grande é substituído pelo tamanho da string, um limite superior menor que o limite inferior retorna uma string vazia."Respostas:
Você está correto!
'example'[3:4]
e'example'[3]
são fundamentalmente diferentes, e cortar fora dos limites de uma sequência (pelo menos para integrados) não causa um erro.Pode ser surpreendente no início, mas faz sentido quando você pensa a respeito. A indexação retorna um único item, mas o fatiamento retorna uma subsequência de itens. Portanto, quando você tenta indexar um valor inexistente, não há nada a retornar. Mas quando você divide uma sequência fora dos limites, ainda pode retornar uma sequência vazia.
Parte do que é confuso aqui é que as strings se comportam de maneira um pouco diferente das listas. Veja o que acontece quando você faz a mesma coisa com uma lista:
>>> [0, 1, 2, 3, 4, 5][3] 3 >>> [0, 1, 2, 3, 4, 5][3:4] [3]
Aqui, a diferença é óbvia. No caso de strings, os resultados parecem ser idênticos porque em Python não existe um caractere individual fora de uma string. Um único caractere é apenas uma string de 1 caractere.
(Para a semântica exata de fatiar fora do intervalo de uma sequência, consulte a resposta de mgilson .)
fonte
None
vez de um erro - essa é a convenção usual do Python quando você não tem nada para retornar.None
nesse caso tornaria mais difícil saber entre um índice fora dos limites e umNone
valor dentro de uma lista. Mas mesmo que houvesse uma solução alternativa para isso, permanece claro para mim que retornar uma sequência vazia é a coisa certa a se fazer quando é fornecida uma fatia fora dos limites. É análogo a realizar a união de dois conjuntos disjuntos.None
valores em uma lista.Para adicionar uma resposta que aponta para uma seção robusta na documentação :
Dada uma expressão de fatia como
s[i:j:k]
,se você escrever
s[999:9999]
, python está retornandos[len(s):len(s)]
desde entãolen(s) < 999
e seu passo é positivo (1
- o padrão).fonte
k
é positivoi
ej
também são aumentados para-len(s)
quando são menores? por exemplos = 'bac'; s[-100:2] == s[-len(s):2]
k
é positivo, o Python escalai
ej
de modo a que eles se encaixam os limites da sequência. No seu exemplo,s[-100:2] == s[0:2]
(== s[-len(s):2]
, a propósito). Da mesma formas[-100:100] == s[0:2]
,.O corte não tem limites verificados pelos tipos internos. E embora ambos os exemplos pareçam ter o mesmo resultado, eles funcionam de forma diferente; experimente-os com uma lista.
fonte