|
发表于 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
|
|