乐趣区

关于Python之路:Python之路day06深浅拷贝isid代码块缓存

前言时刻

感觉好快呀,人不知; 鬼不觉曾经到了第 6 天,就有一个感觉就是,看视频很爽,然而写总结 + 代码就累。所以就能够看出一个问题,总结是很有用的。

不说了,当初都快 9 点了,博客还没写,放松写,要睡觉了。

总结总结:

明天学习了代码块、Python 的缓存机制、深浅拷贝。其中深浅拷贝是最重要的。

1、代码缓存机制

Python 的代码缓存机制超级重要,对了解深浅拷贝至关重要。Python 的代码缓存机制个别有两种形式,一种是同一代码块中,另一种是不同代码块中。

同一代码块:指的的是一个模块、一个文件、一个类都能够叫做同一代码块。其缓存指的是所有整数、布尔值、以及简直全副的字符串,只有值雷同,就不在反复创立存储空间。

# 1、同一代码块中

# 字符串
name = "wang"
name2 = "wang"

# 整数
age = 18
age2 = 18

# 布尔
is_study = True
is_study2 = True

print(name is name2)  # True
print(age is age2)  # True
print(is_study is is_study2)  # True

从下面能够看出,所有的 int、bool 以及简直所有的字符串都做了缓存优化。除了这三种其余的数据类型均不进行缓存。

不同代码块:个别称之为小数据池,比方你在终端中敲的一行一行的代码,就属于不同代码块。缓存从 -5~255 的整型、bool、以及满足条件的字符串。

在前面的深浅拷贝,你就会深刻理解缓存机制。

1.1、id 函数

id 是取出存储数据的内存地址号

# 1、id 是取出存储数据的内存地址号

age = 18
name = "zhang"

print(id(name))   # 140360327550384
print(id(age))   # 4548361408

1.2、is 的作用

# 2、is 的作用是判断两者的内存地址是否雷同。能够认为是 id 
name2 = name
name3 = "zhang"

print(name2 is name)   # True
print(name3 is name)   # True
print(name3 == name)   # True

"""
1、解释下为什么 name3 和 name 的存储地址一样呢?起因就是 Python 的缓存机制,在同一代码块下,int、bool、大部分的 str,变量的值雷同的话,都是指向同一个存储地址上。说白了就是节俭开销。而 name2 和 name 雷同,属于浅拷贝,不难理解,相当于是援用。2、== 的作用是?== 是判断两端的数据是否雷同,而 is 是判断存储数据的地址是否一样(地址一样,数据是必然一样的)。"""

1.4 == 的作用

== 是判断两端的数据值是否雷同,而 is 是判断存储数据的存储地址是否一样(地址一样,数据是必然一样的)。

# 2、== 

name1 = "tree"
name2 = "tree"

print(name1 == name2)  # True

2、深浅拷贝

深浅拷贝的概念很重要,必须要搞懂,否则你会很糊的。尤其是面试的时候,须要手写答案。

2.1、援用型

# 1、“援用”相当于是从新定义一个变量 但指向同一个列表地址,说白了就是换了个皮。s1 = [1, 2, [3, 4]]
s2 = s1

s1[-1].append(5)
s2.append(666)

print(s1, s2)   
# [1, 2, [3, 4, 5], 666]       [1, 2, [3, 4, 5], 666]

# 从后果会发现,s1 和 s2 一毛一样,援用的是同一个内存地址

2.2、浅拷贝

浅拷贝之后,其成员不创立新的存储空间,和原成员共用一个。

# 2、浅拷贝

import copy

s1 = [1, 2, [3, 4]]
s2 = copy.copy(s1)

s1.append(666)
s2[-1].append(5)
print(s1, s2)   # [1, 2, [3, 4, 5], 666]     [1, 2, [3, 4, 5]]

# 剖析:

1、s2 对 s1 进行了浅拷贝,拷贝的仅仅是各成员的的存储地址(相当于是援用),并未复制一份新的存储空间寄存个成员。

所以当对 s1 进行追加 666 时,在 s1 中增加了一个 666 的存储地址。而 s2 中并没有,所有没有 666。

2、s1 外部有一个列表(设:l1)变量(属于可变数据类型),当浅拷贝时仅仅是拷贝这个列表的内存地址,并未复制一份新的存储空间寄存此列表 l1。

所以当对 s2 的最初一个元素进行追加 5 时,s1 和 s2 都指向 l1 地址。

所以当

能够看上面这张图

2.3、深拷贝

成员为 不可变数据 类型的值,不创立新的存储空间,共用一个。可变的数据类型,复制一份新的,开拓新的存储空间。

说下深拷贝的实用场景,次要用于为了避免复制进去的对象,对原对象造成扭转。

import copy

# 深拷贝,没啥好说的,间接复制一份一毛一样的,彼此之间没有影响

s1 = [1, 2, [3, 4]]
s2 = copy.deepcopy(s1)

s1.append(666)
s2[-1].append(5)

print(s1, s2)  
# [1, 2, [3, 4], 666] [1, 2, [3, 4, 5]]


# 代码缓存的问题  做题的坑

s1 = [1, 2, [3, 4]]
s2 = copy.deepcopy(s1)

print(s1[0] is s2[0])

print(s1[-1] is s2[-1])

print(s1[-1][0] is s2[-1][0])

# 测测你会答对了几个?"""
True
False
True
"""

面试题小试牛刀:

  1. 深度拷贝的题:

    # 代码缓存的问题  做题的坑
    
    s1 = [1, 2, [3, 4]]
    s2 = copy.deepcopy(s1)
    
    print(s1[0] is s2[0])
    
    print(s1[-1] is s2[-1])
    
    print(s1[-1][0] is s2[-1][0])
    
    # 测测你会答对了几个?"""
    True
    False
    True
    """
    
  2. 浅拷贝的题:

    # 2、浅拷贝题
    
    s1 = [1, 2, [3, 4]]
    s2 = copy.copy(s1)
    
    print(s1[0] is s2[0])
    
    print(s1[-1] is s2[-1])
    
    print(s1[-1][0] is s2[-1][0])
    
    
    # 测测你会答对了几个?"""
    True
    True
    True
    """
    

总结:

写了 6 天的我的项目,才补的 day06 的博客,手动悔恨中,今天开始失常看视频 + 写博客中。另外今天开启一天学两天的课模式,节省时间,要给前面学习 Java 腾工夫。

参考文章:

https://www.cnblogs.com/jin-x…

退出移动版