python - length - ¿Por qué str.count('''') y len(str) dan resultados diferentes?
length python (3)
Mire el siguiente código y explique por qué el
str.count('''')
y la función
len(str)
están dando dos salidas diferentes.
a=''''
print(len(a))
print(a.count(''''))
Salida:
0
1
Devuelve el número de ocurrencias no superpuestas de subsecuencia sub en el rango [inicio, fin]. Los argumentos opcionales start y end se interpretan como en notación de corte.
Si echamos un vistazo a la
implementation
, encontramos que llama a la función
stringlib_count
(
source
) que simplemente continúa y devuelve la longitud de la cadena más uno, cuando la longitud del sub es cero:
if (sub_len == 0)
return (str_len < maxcount) ? str_len + 1 : maxcount;
( fuente )
Nota
:
maxcount
se establece en el valor positivo más grande de
size_t
.
Por supuesto, eso es solo un corto circuito. Si omitimos esa verificación, el código pasa a llamar a FASTSEARCH .
¿Cómo se implementa FASTSHEARCH ? Se ejecuta en un loop , verificando cada posición si la cadena coincide con el sub en esa posición.
Como está buscando una cadena vacía, dirá que coincide en cada posición (en cada posición, no encuentra caracteres que difieran, hasta la longitud del sub).
Recuerde que está buscando en el rango inclusivo de principio a fin. Lo que significa que se verá en todas las posiciones de la cadena, es decir:
- El inicio (antes del primer personaje)
- Entre cada par de caracteres (después de cada personaje, antes del siguiente)
- El final (después del último personaje)
Esa es una posición por personaje (antes de cada personaje) más una (el final). O si lo prefiere, es una posición por personaje (después de cada personaje) más una (el comienzo). En cualquier caso, devolverá la longitud de la cadena más uno. Los desarrolladores lo cortocircuitaron para evitar hacer el bucle.
.count('''')
cuenta el número de ubicaciones de cadenas de longitud cero.
También podría pensar en esto como el número de posibles posiciones del cursor.
"test".count('''')
t e s t
^ ^ ^ ^ ^
En lugar de contar la cantidad de caracteres (como
len(str)
), estás contando la cantidad de anti-caracteres.
str.count()
cuenta las ocurrencias no superpuestas de la subcadena:
Devuelve el número de ocurrencias no superpuestas de subcadena sub .
Hay exactamente uno de esos lugares donde la subcadena
''''
ocurre en la cadena
''''
: justo al comienzo.
Entonces el conteo
debería
devolver
1
.
En términos generales, la cadena vacía coincidirá en todas las posiciones de una cadena dada, incluso al principio y al final, por lo que el recuento siempre debe ser la longitud más 1:
>>> ('' '' * 100).count('''')
101
Esto se debe a que se considera que existen cadenas vacías entre todos los caracteres de una cadena; para una longitud de cadena 2, hay 3 cadenas vacías; uno al principio, uno entre los dos personajes y uno al final.
Entonces sí, los resultados son diferentes y son completamente correctos.