python中==、is的区别和深拷贝、浅拷贝的区别

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]

猜你喜欢

转载自blog.csdn.net/qq_41020281/article/details/80244472