Python之路day06-深淺拷貝_is_id_==_代碼塊緩存

前言時刻

感受好快呀,不知不覺已經到了第6天,就有一個感受就是,看視頻很爽,可是寫總結+代碼就累。因此就能夠看出一個問題,總結是頗有用的。html

不說了,如今都快9點了,博客還沒寫,抓緊寫,要睡覺了。python

總結總結:面試

今天學習了代碼塊、Python 的緩存機制、深淺拷貝。其中深淺拷貝是最重要的。緩存

一、代碼緩存機制

Python 的代碼緩存機制超級重要,對理解深淺拷貝相當重要。Python 的代碼緩存機制通常有兩種方式,一種是同一代碼塊中,另外一種是不一樣代碼塊中。app

同一代碼塊:指的的是一個模塊、一個文件、一個類均可以叫作同一代碼塊。其緩存指的是全部整數、布爾值、以及幾乎所有的字符串,只要值相同,就不在重複建立存儲空間。函數

# 一、同一代碼塊中

# 字符串
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、以及知足條件的字符串。優化

在後面的深淺拷貝,你就會深入理解緩存機制。spa

1.一、id 函數

id 是取出存儲數據的內存地址號code

# 一、id是取出存儲數據的內存地址號

age = 18
name = "zhang"

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

1.2 、is 的做用

# 二、is 的做用是判斷二者的內存地址是否相同。能夠認爲是 id 
name2 = name
name3 = "zhang"

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

"""
一、解釋下爲何name3和name的存儲地址同樣呢?
緣由就是Python的緩存機制,在同一代碼塊下,int 、bool、大部分的str,變量的值相同的話,都是指向同一個存儲地址上。說白了就是節省開銷。
而name2和name相同,屬於淺拷貝,不難理解,至關因而引用。

二、== 的做用是?
== 是判斷兩端的數據是否相同,而is是判斷存儲數據的地址是否同樣(地址同樣,數據是必然同樣的)。

"""

1.4 == 的做用

== 是判斷兩端的數據值是否相同,而 is 是判斷存儲數據的存儲地址是否同樣(地址同樣,數據是必然同樣的)。

# 二、== 

name1 = "tree"
name2 = "tree"

print(name1 == name2)  # True

二、深淺拷貝

深淺拷貝的概念很重要,必需要搞懂,不然你會很糊的。尤爲是面試的時候,須要手寫答案。

2.一、引用型

# 一、「引用」  至關因而從新定義一個變量 但指向同一個列表地址,說白了就是換了個皮。

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 、淺拷貝

淺拷貝以後,其成員不建立新的存儲空間,和原成員共用一個。

# 二、淺拷貝

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]]

# 分析:

一、s2 對 s1 進行了淺拷貝,拷貝的僅僅是各成員的的存儲地址(至關因而引用),並未複製一份新的存儲空間存放個成員。

因此當對 s1 進行追加 666 時,在 s1 中添加了一個666的存儲地址。而 s2 中並無,全部沒有666。

二、s1內部有一個列表(設:l1)變量(屬於可變數據類型),當淺拷貝時僅僅是拷貝這個列表的內存地址,並未複製一份新的存儲空間存放此列表l1。

因此當對 s2 的最後一個元素進行追加 5 時,s1 和 s2 都指向 l1 地址。

因此當

能夠看下面這張圖

深淺拷貝

2.三、深拷貝

成員爲不可變數據類型的值,不建立新的存儲空間,共用一個。可變的數據類型,複製一份新的,開闢新的存儲空間。

說下深拷貝的適用場景,主要用於爲了防止複製出來的對象,對原對象形成改變。

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. 淺拷貝的題:

    # 二、淺拷貝題
    
    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...

相關文章
相關標籤/搜索