只有当我们能够更改存储位置中保存的值而不更改存储位置本身时,某些事情才是可变的。
诀窍是:如果发现更改前后的内存位置相同,则它是可变的。
例如,列表是可变的。怎么样?
>> a = ['hello']
>> id(a)
139767295067632
# Now let's modify
#1
>> a[0] = "hello new"
>> a
['hello new']
Now that we have changed "a", let's see the location of a
>> id(a)
139767295067632
so it is the same as before. So we mutated a. So list is mutable.
字符串是不可变的。我们如何证明呢?
> a = "hello"
> a[0]
'h'
# Now let's modify it
> a[0] = 'n'
----------------------------------------------------------------------
我们得到
TypeError:'str'对象不支持项目分配
因此,我们无法使字符串发生变异。这意味着字符串是不可变的。
在重新分配中,您将变量更改为指向新位置本身。在这里,您没有改变字符串,而是改变了变量本身。以下是您正在做什么。
>> a = "hello"
>> id(a)
139767308749440
>> a ="world"
>> id(a)
139767293625808
id
重新分配之前和之后是不同的,因此这证明您实际上不是在变异,而是将变量指向新位置。这不是改变字符串,而是改变变量。