python-深浅拷贝

第四章 内存相关和深浅拷贝

1 内存相关

1.1 id is ==

is 和 == 的区别

  • id()【可以查看内存地址】

i = 100
s = 'alex'
print(id(i))
print(id(s))
  • == 【比较的是两边的值是否相等】

l1 = [1, 2, 3]
l2 = [1, 2, 3]
print(l1 == l2)

s1 = 'alex'
s2 = 'alex '
print(s1 == s2)
  • is 【用于比较内存地址是否相同】

l1 = [1, 2, 3]# 重新开辟内存,并赋值
l2 = [1, 2, 3]
print(id(l1))
print(id(l2))
print(l1 is l2)# False

1.2 代码块

  • 基本定义:

    • 代码块:我们所有的代码都需要依赖代码块执行。

    • 一个文件就是一个代码块。

    • 交互式命令下,一行就是一个代码块。

1.2.1 两个机制

  • 同一个代码块下,遵循一个缓存机制。

    • 前提条件:同一个代码块内。

    • 机制内容:pass

    • 适用的对象: int bool str

    • 具体细则:所有的数字,bool,几乎所有的字符串。

    • 优点:提升性能,节省内存

  • 不同代码块下,遵循另一个缓存机制。【小数据池】

    • 前提条件:不同代码块内。

    • 机制内容:pass

    • 适用的对象: int bool str

    • 具体细则:-5~256数字,bool,满足规则的字符串。

    • 优点:提升性能,节省内存。

    • 小数据池:python中在不同代码块下,为了提高性能,节省内存,会将-5~256的数字和具有一定规则的字符串开辟两个空间,如果你的代码中有满足条件的数据,不会重新创建,还是引用提前创建好的。

1.3 深浅copy

  • 浅拷贝:拷贝的是对象最外层

  • 深拷贝:拷贝的是对象内部的可变类型

  • 浅copy

l1 = [1, 2, 3, [22, 33]]
l2 = l1.copy()
l1.append(666)
print(l1,id(l1))
print(l2,id(l2))
  • 深copy

import copy
l1 = [1, 2, 3, [22, 33]]
l2 = copy.deepcopy(l1)
# print(id(l1))
# print(id(l2))
l1[-1].append(666)
print(l1)
print(l2)
  • 相关

# 应该每次都拷贝一份(但由于小数据池,未拷贝)

v1 = 'alex'

import copy

v2 = copy.copy(v1)

print(id(v1),id(v2))

v1 = 'alex'
import copy
v3 = copy.deepcopy(v1)

print(id(v1),id(v3))
  • 相关面试题

l1 = [1, 2, 3, [22, 33]]
l2 = l1[:] # 浅拷贝
l1[-1].append(666)
print(l1)
print(l2)

浅copy: list dict: 嵌套的可变的数据类型是同一个。
深copy: list dict: 嵌套的可变的数据类型不是同一个
  • 示例

v1 = [11,22,33]     #不管怎么变化,就看是重新赋值还是内部修改
v2 = v1

练习1 (内部修改)

v1 = [11,22,33]
v2 = v1
v1.append(666)
print(v2) # 含 666 :地址相同

练习2:(赋值)

v1 = [11,22,33]
v2 = v1

v1 = [1,2,3,4]

print(v2) :地址不相同

练习3:(重新赋值)

v1 = 'alex'
v2 = v1
v1 = 'oldboy'
print(v2):id也会不同

 

posted @ 2021-03-25 21:18  Jack_Gao  阅读(112)  评论(0)    收藏  举报