Maison >développement back-end >Tutoriel Python >À propos du problème d'indice du découpage de séquence et de sa solution

À propos du problème d'indice du découpage de séquence et de sa solution

零下一度
零下一度original
2017-06-17 11:00:021170parcourir

Cet article vous présente principalement les informations pertinentes sur l'abonnement aux tranches de séquence dans Python L'article le présente en détail à travers un exemple de code, qui a une certaine valeur de référence et d'apprentissage pour tous les amis qui en ont besoin. jetez un œil ensemble ci-dessous.

Préface

En python, le découpage est une syntaxe fréquemment utilisée, qu'il s'agisse d'un tuple, d'une liste ou de String, la syntaxe générale est :

sequence[ilow:ihigh:step] # ihigh, step peut être vide ; par souci de simplicité et de facilité de compréhension, l'utilisation de step est temporairement exclue de la considération

Donnons une démonstration simple d'utilisation


sequence = [1,2,3,4,5]
sequence [ilow:ihigh] # 从ilow开始到ihigh-1结束
sequence [ilow:]  # 从ilow开始直到末尾
sequence [:ihigh]  # 从头部开始直到ihigh结束
sequence [:]   # 复制整个列表

La syntaxe est très concise et facile à comprendre. facile à utiliser dans notre utilisation quotidienne. Mais je crois que lorsque nous utilisons cette syntaxe de découpage, nous suivrons habituellement certaines règles :

  • ilow et ihigh sont tous deux plus petits que la longueur de la séquence

  • ilow 644acf648e52bda907a07c644c59493fsq_slice(s, i1, i2)


    Parce qu'ils sont trois, les implémentations des fonctions sont à peu près les mêmes. , nous n'avons donc besoin d'en analyser qu'un. Ce qui suit est une analyse de la fonction de découpage de la liste :
    // 字符串对象
    StringObject.c: (ssizessizeargfunc)string_slice, /*sq_slice*/
    
    // 列表对象
    ListObject.c: (ssizessizeargfunc)list_slice,  /* sq_slice */
    
    // 元组
    TupleObject.c: (ssizessizeargfunc)tupleslice,  /* sq_slice */


    /* 取自ListObject.c */
    static PyObject *
    list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
    {
     PyListObject *np;
     PyObject **src, **dest;
     Py_ssize_t i, len;
     if (ilow < 0)
      ilow = 0;
     else if (ilow > Py_SIZE(a))    // 如果ilow大于a长度, 那么重新赋值为a的长度
      ilow = Py_SIZE(a);
     if (ihigh < ilow)  
      ihigh = ilow;
     else if (ihigh > Py_SIZE(a))    // 如果ihigh大于a长度, 那么重新赋值为a的长度 
      ihigh = Py_SIZE(a);
     len = ihigh - ilow;
     np = (PyListObject *) PyList_New(len); // 创建一个ihigh - ilow的新列表对象
     if (np == NULL)
      return NULL;
    
     src = a->ob_item + ilow;
     dest = np->ob_item;
     for (i = 0; i < len; i++) {    // 将a处于该范围内的成员, 添加到新列表对象
      PyObject *v = src[i];
      Py_INCREF(v);
      dest[i] = v;
     }
     return (PyObject *)np;
    }

    Conclusion

    Comme le montre la fonction de découpage correspondant à la fonction sq_slice ci-dessus, si lors de l'utilisation du découpage, les indices gauche et droit sont supérieurs à la longueur de la séquence, ils seront réaffectés à la longueur de la séquence, donc notre découpage initial : print a[10:20] , ce qui s'exécute réellement est : print a4:4 . Grâce à cette analyse, vous ne serez plus confus lorsque vous rencontrerez une tranche dont l'indice est supérieur à la longueur de l'objet~

    .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn