在Python中字符串是不可变的,那么为什么Python中允许覆盖操作呢?

在Python中字符串是不可变的,那么为什么Python中允许覆盖操作呢?,python,python-3.x,Python,Python 3.x,在Python中字符串是不可变的,那么为什么Python中允许以下操作 a = 'Hello' a = 'Hi' 因为a是字符串的引用/句柄(如果您愿意,类似于指针),而不完全是字符串。您甚至可以检查内存地址以确保 >>> a = "hello" >>> id(a) 140102378280544 # memory address (not exactly but that's irrelevant to the topic) >>> a

在Python中字符串是不可变的,那么为什么Python中允许以下操作

a = 'Hello'
a = 'Hi'

因为
a
是字符串的引用/句柄(如果您愿意,类似于指针),而不完全是字符串。您甚至可以检查内存地址以确保

>>> a = "hello"
>>> id(a)
140102378280544 # memory address (not exactly but that's irrelevant to the topic)
>>> a = 'hii'
140102388086864 # different memory address than before
Python中的字符串是不可变的,因为它们只存储在一个位置(大部分),因此不能进行变异

 >>> a = 'country'
 >>> b = 'country'
 >>> id(a) == id(b)
 True
 >>> a is b
 True

因为
a
是字符串的引用/句柄(如果您愿意,类似于指针),而不完全是字符串。您甚至可以检查内存地址以确保

>>> a = "hello"
>>> id(a)
140102378280544 # memory address (not exactly but that's irrelevant to the topic)
>>> a = 'hii'
140102388086864 # different memory address than before
Python中的字符串是不可变的,因为它们只存储在一个位置(大部分),因此不能进行变异

 >>> a = 'country'
 >>> b = 'country'
 >>> id(a) == id(b)
 True
 >>> a is b
 True
不同的变量。。。尽管我必须说,
id
的值充其量只是指示性的

当您尝试将文字重新分配给
a
时,您没有更改字符串。字符串保持不变。更改的是
a
指向的引用

不同的变量。。。尽管我必须说,
id
的值充其量只是指示性的



当您尝试将文字重新分配给
a
时,您没有更改字符串。字符串保持不变。更改的是
a
指向的引用。

,因为
a
不是字符串。它是引用字符串的名称。它可以被[re]/[un]绑定。
a
看到它的引用在此过程中发生了更改。字符串是不可变的。绑定名
a
不是。您没有更改字符串。您正在将
a
设置为其他字符串。请尝试
a[0]=“Z”
,因为
a
不是字符串。它是引用字符串的名称。它可以被[re]/[un]绑定。
a
看到它的引用在此过程中发生了更改。字符串是不可变的。绑定名
a
不是。您没有更改字符串。您正在将
a
设置为不同的字符串。请尝试
a[0]=“Z”
为什么说
id
值只是指示性的?因为在解释器会话中,相同的值可以跨变量重用。为什么说
id
值只是指示性的?因为在解释器会话中,相同的值可以跨变量重用。我也知道这一点。我的疑问是,若python中的字符串是不可变的,那个么为什么允许重写操作呢?内存级别发生了什么?哪个内存负责此操作?@veneth首先检查我更新的答案。现在,当您为
a
分配新值时,新值
hii
不会存储在与“hello”相同的内存地址中。python中的变量就像已经是解引用的指针。因此,用外行术语来说,当你将值
hii
分配给
a
时,你将
hii
存储在某个内存地址,并将该内存地址的值分配给
a
。我也知道这一点。我的疑问是,若python中的字符串是不可变的,那个么为什么允许重写操作呢?内存级别发生了什么?哪个内存负责此操作?@veneth首先检查我更新的答案。现在,当您为
a
分配新值时,新值
hii
不会存储在与“hello”相同的内存地址中。python中的变量就像已经是解引用的指针。因此,在外行术语中,当您将值
hii
分配给
a
时,您将
hii
存储在某个内存地址,并将该内存地址的值分配给
a