内存地址
一、可变与不可变地址
(一)不可变类型
- 数值、字符串、元组
- 我们不能对这些数据类型改变,a.upper() a变成大写,但是原来的字符串并没有改变,而是生成了一个新变量,这里的地址就和原来的a不是同一个了
- 不可变的类型,是指在内存中的地址变不变
- 值改变了,id就改变了
- 数值、字符串可当成常量,对于数值来说,只要值相等,变量的地址就是一样的
(二)可变类型
- 列表 字典 集合
- 值改变了,但是id不改变
二 、拷贝下的地址变化
(一)copy() 浅拷贝
作用效果:
- 对象可变:浅拷贝,整体地址不一样,但是内部的元素都是同一个地址
对象不可变:浅拷贝,整体地址 和 内部的元素都是同一个地址 - 内部的元素可变:新对象可以改变原来的对象
内部的元素不可变:就可以当成是常量,不能修改,所以地址问题无所谓
使用
- a.copy()
只支持可变 - import copy
copy.copy()
任何类型都支持
作用过程:
- 可变对象1里面在裹可变对象2,2的储存地址和1的地址并不是同一个,1中储存的2是从外部引用过来的,在1中创建了一个快捷方式
- 所以copy下,dict2与dict1地址不一样,改变dict2一般不会对dict1产生影响,因为两个字典的地址不一样,但是字典里面的列表是同一个地址,改变dict2列表的内容,dict1的内容也会改变
- 拷贝的时候拷贝第一层的,里面的那一层是拷贝不来的,都是借用到list
所以如果我们对列表的内容进行修改,那么dict1也会修改
(二)copy.deepcopy()深拷贝
- 对于深拷贝,就是将那些可变的同一个地址的换成不同地址,这样新的就不会对原来的产生影响了,不可变的元素一直都是同一个地址
可变类型在深拷贝下,地址就不是同一个了 - 对于那些不可变的类型,深拷贝与浅拷贝都是同一个id地址
二 、“=”赋值下的地址变化
相同值下的地址
直接赋值下的地址