字符串在Python中是不可变的,因此实现可以决定是否进行内部(这通常与C#相关联,这意味着某些字符串存储在池中)这个字符串。
在您的示例中,您正在动态创建字符串。CPython并不 总是 查看池以检测字符串是否已经存在-
这也没有意义,因为您首先必须保留内存以创建字符串,然后将其与池内容进行比较(长期效率低下)字符串)。
但是对于长度为1的字符串,CPython确实会查询池(参见“ stringobject.c”):
static PyStringObject *characters[UCHAR_MAX + 1];...PyObject *PyString_FromStringAndSize(const char *str, Py_ssize_t size){... if (size == 1 && str != NULL && (op = characters[*str & UCHAR_MAX]) != NULL) { #ifdef COUNT_ALLOCS one_strings++; #endif Py_INCREF(op); return (PyObject *)op; }...
所以:
a = str(num)b = str(num)print a is b # <-- this will print False in most cases (but try str(1) is str(1))
但是,当直接在代码中使用 常量 字符串时,CPython使用相同的字符串实例:
a = "text"b = "text"print a is b # <-- this will print True
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)