在Python中字符串是不可变的,那么为什么Python中允许覆盖操作呢?
在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
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
。