python不可变类型
今天学习python的深拷贝/浅拷贝的时候有一个问题没有理解
浅拷贝的时候,如果拷贝的是列表,那么会拷贝第一层,也就是新创建一个列表(新列表和原来的列表内存地址不同)。如果拷贝的是元组,那么连第一层都不会拷贝。也就是说新元组和原来的元组指向的都是同一个内存地址,并不会像拷贝列表那样在内存中新开辟一段地址空间创建新列表。
浅拷贝列表,元组效果

运行效果可以看出新复制的列表可原列表的内存地址是不同的,复制的元组与原元组的内存地址是相同的。
教学视频中给出的解释是元组是不可变类型,使用copy.copy() 方法会判断被复制的内容是什么类型的。
如果不可变类型,那么copy.copy()只会将原内容的地址复制给新的变量。
如果是可变类型,copy.copy() 会复制第一层内容给新的变量。
如列表,如果列表中的元素是列表的话,那么新复制的列表只有第一层的地址是不一样的,列表中的列表的地址还是原来列表中元素的地址。
说到这里就出现一个疑问,到底什么是不可变类型。是相同内容的东西只能在内存中存在一份还是其他情况。
经过尝试发现创建两个内容形同的元组,地址是不一样的。

所以元组这种不可变类型应该不是说内存中不允许出现两份相同的内容,只不过它们的地址不一样而已
数值类型也是不可变类型


变量m和n的内容相同但是地址不同,变量x和y的内容相同,地址相同。
这种情况不是因为不可变类型不允许内存中存在两份相同的内容,而是python将一定范围内的整数保存到了内存中,这个过程在python解释执行器启动后就完成了。所以调用这个范围内的整数都是从内存中直接获取的而不会新创建这个范围内的整数。
通过把可变类型可不可变类型进行比较,我的理解为
可变类型只是内容可变,在原有内存空间里,变量的内容可以被改变,而地址还是原来的地址。
不可变类型是地址不可变,内容也不可变。
至于为什么浅拷贝(copy.copy())的时候,可变类型可以复制第一层内容,也就是开辟一段新的空间(创建新的对象),
不可变类型不能复制第一层内容,可能是基于其他方面的考虑,而这样设计的。
浙公网安备 33010602011771号