内存地址

一、可变与不可变地址

(一)不可变类型

  • 数值、字符串、元组
  • 我们不能对这些数据类型改变,a.upper() a变成大写,但是原来的字符串并没有改变,而是生成了一个新变量,这里的地址就和原来的a不是同一个了
  • 不可变的类型,是指在内存中的地址变不变
  • 值改变了,id就改变了
  • 数值、字符串可当成常量,对于数值来说,只要值相等,变量的地址就是一样的

(二)可变类型

  • 列表 字典 集合
  • 值改变了,但是id不改变

二 、拷贝下的地址变化

(一)copy() 浅拷贝

作用效果:

  • 对象可变:浅拷贝,整体地址不一样,但是内部的元素都是同一个地址
    对象不可变:浅拷贝,整体地址 和 内部的元素都是同一个地址
  • 内部的元素可变:新对象可以改变原来的对象
    内部的元素不可变:就可以当成是常量,不能修改,所以地址问题无所谓

使用

  • a.copy()
    只支持可变
  • import copy
    copy.copy()
    任何类型都支持

作用过程:

python变量内存地址 python中内存地址变不变_字符串

  • 可变对象1里面在裹可变对象2,2的储存地址和1的地址并不是同一个,1中储存的2是从外部引用过来的,在1中创建了一个快捷方式
  • 所以copy下,dict2与dict1地址不一样,改变dict2一般不会对dict1产生影响,因为两个字典的地址不一样,但是字典里面的列表是同一个地址,改变dict2列表的内容,dict1的内容也会改变
  • 拷贝的时候拷贝第一层的,里面的那一层是拷贝不来的,都是借用到list
    所以如果我们对列表的内容进行修改,那么dict1也会修改

(二)copy.deepcopy()深拷贝

  • 对于深拷贝,就是将那些可变的同一个地址的换成不同地址,这样新的就不会对原来的产生影响了,不可变的元素一直都是同一个地址

    可变类型在深拷贝下,地址就不是同一个了
  • 对于那些不可变的类型,深拷贝与浅拷贝都是同一个id地址

二 、“=”赋值下的地址变化

相同值下的地址

python变量内存地址 python中内存地址变不变_python_02

直接赋值下的地址

python变量内存地址 python中内存地址变不变_python_03