在python中比较两个字符串时会发生什么

joe*_*aud 2 python comparison equality python-internals

比较python中的字符串,例如

如果"Hello"=="Hello":#execute某些代码

我很好奇比较字符串的代码是什么.因此,如果我在ci中比较它们,只需比较每个字符,并在一个字符不匹配时中断.我想知道比较这样的两个字符串的过程究竟是什么,即什么时候它会中断,如果这个比较和上面提到的方法之间有什么区别,除了代码行的冗余

Mar*_*ers 9

我假设你在这里使用CPython,标准的Python.org实现.在引擎盖下,Python字符串类型是用C实现的,所以是的,测试两个字符串是否相等完全就像你在C中做的那样.

它的作用是使用该memcmp()函数来测试两个str对象是否包含相同的数据,请参阅以下unicode_compare_eq定义unicodeobject.c函数:

static int
unicode_compare_eq(PyObject *str1, PyObject *str2)
{
    int kind;
    void *data1, *data2;
    Py_ssize_t len;
    int cmp;

    len = PyUnicode_GET_LENGTH(str1);
    if (PyUnicode_GET_LENGTH(str2) != len)
        return 0;
    kind = PyUnicode_KIND(str1);
    if (PyUnicode_KIND(str2) != kind)
        return 0;
    data1 = PyUnicode_DATA(str1);
    data2 = PyUnicode_DATA(str2);

    cmp = memcmp(data1, data2, len * kind);
    return (cmp == 0);
}
Run Code Online (Sandbox Code Playgroud)

只有当str1str2不是同一个对象时才会调用此函数(这是一个简单且便宜的测试对象).它首先检查两个对象是否长度相同并存储相同类型的数据(字符串对象使用灵活的存储实现来节省内存;不同的存储意味着字符串不能相等).

还有其他Python实现,比如Jython或IronPython,它们可能使用不同的技术,但它基本上会归结为相同的东西.

  • @anekix:我经常去CPython实现,足以记住在哪里看。要了解Python内部原理如何工作,可以阅读[C-API](https://docs.python.org/3/c-api/)(包括[随附的教程](https:// docs。 python.org/3/extending/index.html))或仅浏览[源代码](https://github.com/python/cpython)。 (2认同)