在Python中操作不可变对象时,如何创建新对象?

2024-05-13 01:33:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道不可变的对象不能就地更改。将创建一个新对象,并将其重新分配给相同的变量名。通过这种方式,我们可以保持与变量的关联。在内部,变量指向不同的对象

>>> string = 'object'
>>> old_id = id(string)
>>> old_id
4452633584
>>> string = 'new' + string
>>> new_id = id(string)
>>> new_id
4501338544
>>> old_id == new_id
False

在上面的示例中,Python是否创建了一个string可变克隆来连接到'new',然后在重新分配到string之前使这个新对象不可变

我不明白不能在位置上更改的对象是如何操作的

Python不需要改变一个可变的东西来产生一个新的东西吗?如果我想把钉子钉进一块木头里,但是木头是不可改变的,我怎么会得到一块被锤打过的木头呢


Tags: 对象idfalse示例newstringobject方式
1条回答
网友
1楼 · 发布于 2024-05-13 01:33:08

不变性是语言层面的一个概念。该语言指定在创建字符串对象后,实现不会为您提供修改该对象的工具

实现本身可能有内部工具来在创建字符串时修改字符串,然后再让您访问它

例如,在CPython string implementation中,通过创建一个具有新大小的空PyUnicode对象来执行字符串连接,该对象在内部表示字符串。然后,在返回对象之前,复制两个原始字符串中的字符:

PyObject *
PyUnicode_Concat(PyObject *left, PyObject *right)
{
    PyObject *result;
    /* […] */
    Py_ssize_t left_len, right_len, new_len;

    /* […] */

    left_len = PyUnicode_GET_LENGTH(left);
    right_len = PyUnicode_GET_LENGTH(right);

    /* […] */

    result = PyUnicode_New(new_len, maxchar);
    /* […] */
    _PyUnicode_FastCopyCharacters(result, 0, left, 0, left_len);
    _PyUnicode_FastCopyCharacters(result, left_len, right, 0, right_len);
    /* […] */
    return result;
}

If I want to hammer a nail into a piece of wood, but that wood is unchangeable, how do I end up with a hammered piece of wood?

在这个类比中,这意味着你得到一块已经有钉子的木头,但你没有得到锤子。语言实现为您敲响了警钟,但您不能假设它是如何做到的。它可能用了锤子,也可能在钉子周围种了一棵树

相关问题 更多 >