python的字符串对象

python3中采用的是unicode编码方式

typedef struct {
   
    PyObject_HEAD
    Py_ssize_t length;          /* Number of code points in the string */
    Py_hash_t hash;             /* Hash value; -1 if not set */
    struct {
   
        unsigned int interned:2;
        unsigned int kind:3;
        unsigned int compact:1;
        unsigned int ascii:1;
        unsigned int ready:1;
        unsigned int :24;
    } state;
    wchar_t *wstr; 
} PyASCIIObject;

typedef struct {
   
    PyASCIIObject _base;
    Py_ssize_t utf8_length;
    char *utf8; 
    Py_ssize_t wstr_length; 
} PyCompactUnicodeObject;
typedef struct {
   
    PyCompactUnicodeObject _base;
    union {
   
        void *any;
        Py_UCS1 *latin1;
        Py_UCS2 *ucs2;
        Py_UCS4 *ucs4;
    } data;                     /* Canonical, smallest-form Unicode buffer */
} PyUnicodeObject;

如何创建一个字符串对象,python提供了很多的API来创建一个字符串对象,这只是其中的一种

PyObject *PyUnicode_FromString(const char *u)
{
   
    size_t size = strlen(u);
    if (size > PY_SSIZE_T_MAX) {
   
        PyErr_SetString(PyExc_OverflowError, "input too long");
        return NULL;
    }
    return PyUnicode_DecodeUTF8Stateful(u, (Py_ssize_t)size, NULL, NULL);
}

PY_SSIZE_T_MAX是跟平台有关的值,在WIN64系统下数值应该为
4 294 967 295换算一下也就是4GB,而WIN32系统下则为2GB,一般我们是碰不到这个临界值的。

字符串对象的intern机制

PyUnicode_InternInPlace(PyObject **p)
{
   
    PyObject *s = *p;
    PyObject *t;
#ifdef Py_DEBUG
    assert(s != NULL);
    assert(_PyUnicode_CHECK(s));
#else
    if (s == NULL || !PyUnicode_Check(s))
        return;
#endif
    /* If it's a subclass, we don't really know what putting
       it in the interned dict might do. */
    if (!PyUnicode_CheckExact(s))
        return;
    i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值