如果字符串是不可变的,那么这怎么可能呢?

时间:2016-10-15 15:55:44

标签: python python-3.x immutability

我是python的新手,正在浏览python3文档。在python中,字符串被认为是不可变的,那么这怎么可能:

if __name__ == '__main__':
        l = 'string'
        print(l)
        l = l[:2]
        print(l)

返回此输出:

string
st

3 个答案:

答案 0 :(得分:3)

非正式地,www.site.com/sounds/silly/horses.html现在指向一个新的不可变字符串,它是旧字符串的一部分的副本。

您不能做的是修改字符串。

l

但你可以这样做:

a = "hello"
a[0] = "b"  # not allowed to modify the string `a` is referencing; raises TypeError

print(a)  # not reached, since we got an exception at the previous line

答案 1 :(得分:3)

理解这个问题的关键是要意识到Python中的变量只是一个指向底层对象的“指针”。你混淆了不可变对象和不可变变量的概念(Python中不存在)。

例如,在您的情况下,l最初是一个指向内容为“string”的str对象的指针。但稍后,您将其“重定向”到内容为“st”的新str对象。请注意,当程序运行到行l = l[:2]时,它是指针被修改,而不是指针指向的对象。如果您愿意,还可以将l“重定向”到另一个类型不是str的对象,例如l = 123。请记住,lstr“string”)指向的原始对象根本没有被修改,它仍然存在于内存中(在它被垃圾收集之前),但只是不再指向到l

为了更好地理解不可变对象的概念,让我们看看一个可变对象。例如,Python中的list是可变的。

l = [1, 2, 3] # a new list with three elements
l.append(4) # append a new element 4 to the list (l is now modified!!!)

在上面的代码中,我们通过向其添加新元素来修改l。在整个程序中,l指向同一个对象,但它是l指向的对象,在此过程中发生了变化。

答案 2 :(得分:0)

字符串本身是不可变的,但是变量可以绑定到任何东西。 id()方法检查对象的“ id”。见下文。

>>> l = 'string'
>>> print(l, id(l))
string 2257903593544
>>> l = l[:2]
>>> print(l, id(l))
st 2257912916040

l被绑定到一个仅包含“ st”的新不可变对象。