1.id()
查看变量地址
a = 'asdfasdf'
id(a)
2.'=='和‘is’
‘==’是用来判断值相等(值比较)
‘is’用来判断变量地址是否相等(引用比较)
ps:Python是一个彻底的面向对象的语言,Python的变量都是以Object形式存在的。Python似乎有一个类似于Java的对象池,为了追求效率,Java会维护对象池,对整数来说,Java会将128以内(即0到127)的整数存在pool里。若用户要求创建一个128以内的Integer时,JVM不会真去创建一个新的对象, 而是直接从这个pool里将对应整数对象的引用返回。而Python也有类似的机制,但范围不是128以内了。通过测试得出Python的范围是(-5)~(256)(现在我知道了,这个东西叫小整数对象池。。。)
3.深拷贝、浅拷贝
1. 浅拷贝
- 浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容
- 一般来说,‘=’就是浅拷贝,只是创建了一个指向原来变量地址的引用
2. 深拷贝
- 深拷贝是对于一个对象所有层次的拷贝(递归)
Python的每个对象都分为可变和不可变,主要的核心类型中,数字、字符串、元组是不可变的,列表、字典是可变的。对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。
- python实现深拷贝的方法是copy模块中的deepcopy()方法,实质是递归拷贝所有层次。
3. 拷贝的其他方式
- 浅拷贝还可以使用copy模块的copy()方法
- copy方法拷贝可变类型时会自动生成一个新的地址,拷贝成被拷贝对象的最外层。例如
- 分片表达式可以赋值一个序列
a = "abc"
b = a[:]
- 字典的copy方法可以拷贝一个字典
d = dict(name="zhangsan", age=27)
co = d.copy()
- 有些内置函数可以生成拷贝(list)
a = list(range(10))
b = list(a)
- copy模块中的copy函数
import copy
a = (1,2,3)
b = copy.copy(a)