作用:用来记录事务的状态

使用原则:先定义后引用,通过变量名引用到值

在python中,当需要使用一个变量时,不需要对其提前进行类型声明,而是在给变量赋值时自然而然地决定变量的类型。因此,变量的类型也是可变的

python是一门动态型语言,解释器会根据赋值或运输来自动推断变量的类型。这跟python的存储原理有关

变量和变量所指的值存放在不同的存储位置

变量其实就是一个指针,指针的内容是一个存储地址,指向对应的值所在的存储块,在64位的CPU架构中,所有的地址都是以64位表示,所以变量本身都是64位长的指针

变量定义的注意事项

  1. 变量在使用前一定要赋值,赋值号为=,变量在左边,值在右边。不赋值,程序会报错
  2. 变量名必须以字母或下划线开头,变量名不能以数字开头,变量名不能有空格,变量名区分大小写
  3. 变量名不能使用python已有的关键字

直接引用指的是从栈区出发直接引用到的内存地址,间接引用指的是从栈区出发引用到堆区后再进一步引用到的内存地址

直接引用

x=10,print(x) 通过变量名x(x和值的内存地址绑定在一起)直接找到值,称为值的直接引用。

间接引用

列表名L(在栈区)绑定的内存地址(在堆区)存放的是索引和对应值的内存地址,也就是列表里面没有存放真正的值
字典和列表属于容器类型,通过索引和键找到值的内存地址(不是直接通过列表名字或者字典名字找到某个值的内存地址),然后找到值,称为值的间接引用

内存管理(python解释器做的事):垃圾回收机制

内存管理:申请内存,释放内存,是一件非常繁琐的事情(底层的操作),而且危险性高,处理不当,程序就会崩掉
关于变量的存储,内存中有两块区域:堆区与栈区,在定义变量时,变量名与值内存地址的关联关系存放于栈区,变量值存放于堆区,内存管理回收的则是堆区的内容,

一个值在内存中没有任何变量指向它了,该值无法被访问到,就会变成垃圾

绑定到某个值的变量名增加一个,这个值的引用计数增加1

x=10
y=x
z=y

del 变量名 该语句是解除一个变量名与值的绑定关系,那么这个值的引用计数减少1

标记清除,分代回收

内存泄漏问题:列表之间存在相互引用,当解除列表本身的引用之后,由于它们之间存在相互引用,引用计数永远不为0,导致内存永远被占用,无法回收的情况,实际中不要做列表相互引用

可变与不可变类型

在python中,int,float,str,bool被设计成了不可分割的整体,不能够被改变

python中所有的变量保存的都是真实数据所在的地址,即指针,通过变量名找到地址,再通过地址找到数据

不可变类型不能直接在原数据的基础(即原数据的地址)上直接做修改,即:值改变,id也改变,

可变类型可以直接在原数据的基础(即原数据的地址)上直接做修改,即:值改变,id不变,

L=A L和A存放的地址相同,指向同一个列表,对L的修改就是对A的修改

L=A[:] L和A存放的地址不同,指向不同列表,L和A互不影响

向列表中添加元素的方法

  1. L=L+[i],原列表会被复制,L指向新列表,并在新列表中加入新元素
  2. L.append(i),在原列表中添加新元素,不产生新列表
  3. L=+[i],在原列表中添加新元素,不产生新列表