我是python的新手,正在浏览python3文档。在python中,字符串被认为是不可变的,那么这怎么可能:
if __name__ == '__main__':
l = 'string'
print(l)
l = l[:2]
print(l)
返回此输出:
string
st
答案 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
。请记住,l
(str
“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”的新不可变对象。