python - 字符串 split() 的身份怪癖

标签 python string split primitive

>>> 'hi'.split()[0] is 'hi'
    True    
>>> 'hi there'.split()[0] is 'hi'
    False
>>> 'hi there again'.split()[0] is 'hi'
    False

我的假设:

第一行只有一个元素在split中,而其他两行有多个元素。我相信,虽然像 str 这样的 Python 原语在函数中按值存储在内存中,但函数之间将有单独的分配以简化内存管理。我认为 split() 是其中的一个函数,它通常会分配新的字符串。但它也处理不需要任何拆分的输入的边缘情况(例如 'hi'),其中简单地返回原始字符串引用。我的解释正确吗?

最佳答案

I believe that while Python primitives like str are stored in memory by value within a function, there will be separate allocations across functions to simplify memory management.

Python 的对象分配不是那样工作的。没有真正的“原语”概念,除了字节码编译器为合并常量所做的一些事情外,两个对象是在同一个函数中创建还是在不同函数中创建并不重要。

没有比指出来源更好的答案了,所以 here it is :

Py_LOCAL_INLINE(PyObject *)
STRINGLIB(split_whitespace)(PyObject* str_obj,
                           const STRINGLIB_CHAR* str, Py_ssize_t str_len,
                           Py_ssize_t maxcount)
{
    ...
#ifndef STRINGLIB_MUTABLE
        if (j == 0 && i == str_len && STRINGLIB_CHECK_EXACT(str_obj)) {
            /* No whitespace in str_obj, so just use it as list[0] */
            Py_INCREF(str_obj);
            PyList_SET_ITEM(list, 0, (PyObject *)str_obj);
            count++;
            break;
        }

如果它没有找到任何可拆分的空格,它只会在返回的列表中重用原始字符串对象。这只是此函数的编写方式的一个怪癖,您不能依赖它在其他 Python 版本或非标准 Python 实现中以这种方式工作。

关于python - 字符串 split() 的身份怪癖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33574507/

相关文章:

python - 如何将矩形矩阵转换为随机且不可约的矩阵?

java - 如何在文本之间插入新行

string - 如何获得耗时(以毫秒为单位)

Java .split() 按字符串中带空格的字符

java - 有没有办法按行拆分 RDD?

python - 如何在 Python 中第一次出现字母时拆分字符串?

python - 如何使用 Docker 清除 Django 的缓存?

python - python中不区分大小写的字符串类

python - 根据子字符串在日志文件中查找特定行 - Python

java - 如何控制 TextView 何时将 String 发送到新行?