shatanzongcai 发表于 2020-7-14 23:36:04

关于intern机制的一些问题

大家好,我看到了python有关intern机制的一些内容(参考网站)。这份资料里面有这样的一段话:

什么是intern机制?即值同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。

于是我觉得很纠结,什么是不可变对象呢?如果有一段代码是这样的:

a = "abcdefg"
a = a[:3]

那么这儿新的a的值肯定和原来的a不一样了,python会给它分配一个新的内存地址吗?还是说会拿出原来的a的内存里的数据处理一下?我不太理解对字符串的各种处理,比方说切片,split这些都是怎么处理内存数据的。不可变对象指的又是什么意思呢?那数字之类的是不可变对象吗?

Twilight6 发表于 2020-7-15 08:31:27



我们运行下面代码就会发现 , Python 分配给 a 、b 两个参数的 id 地址相同,就是字符串的 intern机制:
a = 'I love FishC.com'
b = 'I love FishC.com'
print(id(a))
print(id(b))
输出结果,一个相同的字符串,Python 只会将该对象保留一个内存地址,也就是说共用一个内存地址:
2304211364240
2304211364240

于是我觉得很纠结,什么是不可变对象呢?如果有一段代码是这样的:

a = "abcdefg"
a = a[:3]
你首先要知道 , 列表切片过程中相对于浅拷贝 copy() 函数,只是列表切片可以设定 copy 的元素范围个数

而浅拷贝我们知道是对列表直接重新开辟一个内存的,也就是创建了个新的列表,当然 Python 会给他重新分配一个内存地址

我们运行下代码就知道:
a = "abcdefg"
b = a[:3]
print(id(a))
print(id(b))
运行结果:
1619335362864
1619336349872
会发现地址并不相同,也就是重新开辟了新的内存地址

我不太理解对字符串的各种处理,比方说切片,split这些都是怎么处理内存数据的。不可变对象指的又是什么意思呢?

切片用法和 split 切割字符串,都是在原字符串上创建了个新的数据,也就是新的 id 地址

不可变对象就是指 : 该对象所指向的内存中的值不能被改变。当改变某个变量时候

由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再重新指向这个新的地址。

而可变对象就是指 : 对象可以被改变过程中不改变 id 地址,而值直接发生改变,不会开辟新的出地址,而是在原 id 地址上直接对值进行改变。

那数字之类的是不可变对象吗?

不可变类型对象有: 整型int 、浮点型float 、元组tuple 、字符串str

可变类型对象有:列表list、字典dict、集合set



shatanzongcai 发表于 2020-7-15 11:18:19

Twilight6 发表于 2020-7-15 08:31
我们运行下面代码就会发现 , Python 分配给 a 、b 两个参数的 id 地址相同,就是字符串的 intern机制 ...

谢谢!
页: [1]
查看完整版本: 关于intern机制的一些问题