1. == 与 is 的区别:
In [9]: a = [100,200,300]
In [10]: b = [100,200,300]
In [11]: a is b
Out[11]: False
In [12]: a == b
Out[12]: True
- is 是比较两个引用(地址)是否指向了同一个对象(引用比较)。
- == 是比较两个对象是否相等,值相等的两个对象内存地址不一定相等
In [13]: id(a)
Out[13]: 140087036467400
In [14]: id(b)
Out[14]: 140087046848712
但是存在特殊情况:
In [15]: a = 100
In [16]: b = 100
In [17]: a is b
Out[17]: True
In [18]: a == b
Out[18]: True
该结果是True,这又是怎么回事呢?
In [19]: id(a)
Out[19]: 10922592
In [20]: id(b)
Out[20]: 10922592
发现这两个地址是一样的,介于[-5, 256]之间的整数,值相同的整数都会共享同一个对象,所以在该范围内,不管出现多少个相同的数值,都表示同一个对象,指向同一个对象。
2.深拷贝 与 浅拷贝的区别:
1. 浅拷贝
- 浅拷贝是对于一个对象的顶层拷贝
通俗的理解是:拷贝了引用,并没有拷贝内容
In [61]: a = [100,200]
In [62]: b = a
In [63]: id(a)
Out[63]: 140087044579464
In [64]: id(b)
Out[64]: 140087044579464
In [65]: a.append(300)
In [66]: a
Out[66]: [100, 200, 300]
In [67]: b
Out[67]: [100, 200, 300]
2. 深拷贝
- 深拷贝是对于一个对象所有层次的拷贝(递归)
In [68]: import copy
In [69]: a = [100,200]
In [70]: b = copy.deepcopy(a)
In [71]: a
Out[71]: [100, 200]
In [72]: b
Out[72]: [100, 200]
In [73]: a.append(300)
In [74]: a
Out[74]: [100, 200, 300]
In [75]: b
Out[75]: [100, 200]
3. 拷贝的其他方式
copy模块中的deepcopy是深拷贝
copy模块中的copy对拷贝的类型不同而不同
In [92]: a = [100,200]
In [93]: b = copy.copy(a)
In [94]: id(a)
Out[94]: 140087046709640
In [95]: id(b)
Out[95]: 140087044432008
列表是可变类型,可以看到地址是不一样的,拷贝为深拷贝
In [96]: a = (100,200)
In [97]: b = copy.copy(a)
In [98]: id(a)
Out[98]: 140087044912712
In [99]: id(b)
Out[99]: 140087044912712
元组为不可变类型,出现地址一样的情况,即拷贝为浅拷贝
- 分片表达式可以赋值一个序列(深拷贝)
In [107]: a = [1,2,3,4,5]
In [108]: b = a[:]
In [109]: a
Out[109]: [1, 2, 3, 4, 5]
In [110]: b
Out[110]: [1, 2, 3, 4, 5]
In [111]: id(a)
Out[111]: 140087044443592
In [112]: id(b)
Out[112]: 140087044444552
- 字典的copy方法可以拷贝一个字典(深拷贝)
In [116]: a = {'name':'辉辉咯', 'age':'23'}
In [117]: b = a.copy()
In [118]: a
Out[118]: {'name': '辉辉咯', 'age': '23'}
In [119]: b
Out[119]: {'name': '辉辉咯', 'age': '23'}
In [120]: id(a)
Out[120]: 140087044423112
In [121]: id(b)
Out[121]: 140087044914440
In [122]: a['height'] = 172
In [123]: a
Out[123]: {'name': '辉辉咯', 'age': '23', 'height': 172}
In [124]: b
Out[124]: {'name': '辉辉咯', 'age': '23'}
- 有些内置函数可以生成拷贝(list)(深拷贝)
In [125]: a = list(range(10))
In [126]: a
Out[126]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [127]: b = list(a)
In [128]: b
Out[128]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [129]: a.append(10)
In [130]: a
Out[130]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [131]: b
Out[131]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]