变量, 对象和引用
一个变量也就是变量名, 当代码第一次赋值时就创建了他, 之后的赋值将改变已创建的变量名的值.
变量类型, 变量中没有类型之说, 类型存在于对象中, 变量只是在一个特定的时间对对象的引用.
变量使用, 变量出现在表达式中会立即被对象所替代, 所有变量在使用前就应该对其明确赋值.
例如 a = 3 为例
python 将执行 3 个步骤完成这个请求
1, 创建一个对象来代表 3
2, 创建一个一个变量 a, 如果他还没创建的话,
3, 将变量与新的对象相连接
变量 - 引用 - 对象
对象的垃圾回收机制
当变量名被赋予了一个新的对象之后, 如果之前的对象未必其他变量所引用的话, 那么之前的对象的内存空间就会被收回这就是垃圾回收机制
原理:
python 内部对对象都有一个计数器, 计数器记录了当前对象被引用的数目 (被多少对象所引用), 一旦, 精确到同一时间, 计数器为 0, 那么这个对象的内存空间就会被收回.
共享引用
多个变量引用一个对象, 叫做共享引用 a = 2,b=a , 其中 a,b 都指向同一个对象, 指向同一块内存地址.
如果:
- a = 2,
- b = a
- a = 3
输出 a = 3 ,b =2 #因为改变的是变量 a 的引用, 不是对象 2 的改变, 在 python 中变量总是一个指向对象的指针, 给一个变量赋新的值, 并不是改变对象的值, 只是改变对对象的引用.
修改
- >>> l1 = [2,3,4]
- >>> l2 = l1
- >>> l1 = 24
- >>> l2
- [2, 3, 4]
更改 l1 的引用, l2 的引用没有变化.
- >>> L1 = [1,2,3,4]
- >>> L2 = L1
- >>> L2
- [1, 2, 3, 4]
- >>> L1[0] = 0
- >>> L1
- [0, 2, 3, 4]
- >>> L2
- [0, 2, 3, 4]
更改 L1 引用对象的一个元素, L2 也会改变, 因为 L2 也指向同一个元素, 这里就涉及到深拷贝和浅拷贝.
如果想要修改 L1 引用对象的一个元素, 然后又不修改 L2 所引用的对象, 可以使用深拷贝
- >>> import copy
- >>> L1 = [1,2,3,4]
- >>> L2 = L1
- >>> L2 = copy.copy(L1)
- >>> L2
- [1, 2, 3, 4]
- >>> L1[0] = 6
- >>> L1
- [6, 2, 3, 4]
- >>> L2
- [1, 2, 3, 4]
来源: http://www.bubuko.com/infodetail-2769633.html