成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python中的可變與不可變對象

wizChen / 3377人閱讀

摘要:中的可變與不可變對象中的所有東西都是一個對象。和內(nèi)置函數(shù)以整數(shù)形式返回對象的標識。更改可變對象很便宜。不可變的例外并非所有的不可變對象都是不可變的。所以引用該對象的變量不會改變,但對象本身正在改變,但僅在函數(shù)范圍內(nèi)。

Python中的可變與不可變對象

Python中的所有東西都是一個對象。每個Python新手都應(yīng)該學習的是,Python中的所有對象都可以是可變的或不可變的。

讓我們更深入地了解它的細節(jié)...因為Python中的所有東西都是對象,所以每個變量都包含一個對象實例。當一個對象被初始化時,它被分配一個唯一的對象ID。它的類型是在運行時定義的,一旦設(shè)置永遠不會改變,但是如果它是可變類型它的狀態(tài)是可以被改變的。簡單地說,一個可變對象可以在創(chuàng)建之后被改變,一個不可變對象不能。

諸如(int,float,bool,str,tuple,unicode)等內(nèi)置類型的對象是不可變的。像(list,set,dict)這樣的內(nèi)置類型的對象是可變的。自定義類通常是可變的。要模擬類中的不變性,應(yīng)該覆蓋屬性設(shè)置和刪除以引發(fā)異常。

現(xiàn)在出現(xiàn)這個問題,我們?nèi)绾未_定我們的變量是一個可變對象還是不可變對象。為此,我們應(yīng)該了解“ID”和“TYPE”函數(shù)的用途。

ID和TYPE

內(nèi)置函數(shù)id()以整數(shù)形式返回對象的標識。這個整數(shù)通常對應(yīng)于對象在內(nèi)存中的位置,雖然這是針對Python的實現(xiàn)和正在使用的平臺而言。is運算符用來比較兩個對象的標識。

內(nèi)置函數(shù)type()返回一個對象的類型。讓我們看一個簡單的例子

"""示例1""" 
>>> x =“Holberton” 
>>> y =“Holberton” 
>>> id(x)
140135852055856 
>>> id(y)
140135852055856 
>>> print(x is y)" ""比較類型""" 
真的
"""示例2""" 
>>> a = 50 
>>> type(a)
 
>>> b =“Holberton” 
>>> type(b)

現(xiàn)在我們已經(jīng)看到了如何比較兩個簡單的字符串變量來找出類型和ID。因此,使用這兩個函數(shù),我們可以檢查不同類型的對象是如何與變量相關(guān)聯(lián)以及如何更改對象的。

可變和不可變的對象

正如我們前面所討論的,一個可變對象可以改變它的狀態(tài)或內(nèi)容,不可變對象不能。

可變對象
列表,字典,集,字節(jié)數(shù)組

不可變對象
int,float,complex,string,tuple,frozen set [注:set的不可變版本],bytes

一個實用的例子來找出對象類型的可變性

x = 10
x = y

我們正在創(chuàng)建一個int類型的對象。標識符x和y指向同一個對象。

id(x)== id(y)
id(y)== id(10)

如果我們做一個簡單的操作。

x = x + 1

現(xiàn)在

id(x)!= id(y)
id(x)!= id(10)

x被標記的對象被改變。對象10從未被修改過。不可變對象在創(chuàng)建后不允許修改

在可變對象的情況下

m = list([1,2,3])
n = m

我們正在創(chuàng)建一個類型列表的對象。標識符m和n被標記為同一個列表對象,它是3個不可變的int對象的集合。

id(m)== id(n)

現(xiàn)在從列表對象中彈出一個元素確實會改變對象,

m.pop()

對象ID不會被更改

id(m)== id(n)

m和n將在修改后指向同一個列表對象。列表對象現(xiàn)在將包含[1,2]。

那么從上面的例子中我們看到了什么?

Python以不同方式處理可變對象和不可變對象。
不可變的訪問比可變對象更快。
當你需要改變對象的大小,例如列表,字典等等時,可變對象是很好用的。當你需要確保你創(chuàng)建的對象始終保持不變時,使用不可變對象。
不可變對象對于“更改”而言基本上是昂貴的,因為這樣做涉及到創(chuàng)建副本。更改可變對象很便宜。

不可變的例外..

并非所有的不可變對象都是不可變的。

如前所述,Python容器比如元組,是不可變的。這意味著一個tuple的值在創(chuàng)建后無法更改。但是元組的“值”實際上是一系列名稱,它們與對象的綁定是不可改變的。關(guān)鍵點是要注意綁定是不可改變的,而不是它們綁定的對象。

讓我們考慮一個元組t =("holberton",[1,2,3])

上面的元組t包含不同數(shù)據(jù)類型的元素,第一個元素是一個不可變的字符串,第二個元素是一個可變列表。元組本身不可變。即它沒有任何改變其內(nèi)容的方法。同樣,字符串是不可變的,因為字符串沒有任何可變方法。但是列表對象確實有可變方法,所以可以改變它。這是一個微妙的點,但是非常重要:不可變對象的“值” 不能改變,但它的組成對象是能做到改變的。

對象如何傳遞給函數(shù)

對于我們來說,了解可變類型和不可變類型之間的區(qū)別以及將它們傳遞到函數(shù)時如何處理是非常重要的。當使用正確的對象時,存儲效率會受到很大影響。

例如,如果一個可變對象在函數(shù)中被引用調(diào)用,它可以改變原來的變量本身。因此為了避免這種情況,需要將原始變量復制到另一個變量中。不可變的對象可以通過引用來調(diào)用,因為它的值不能被改變。

def updateList(list1):
    list1 + = [10]
n = [5,6] 
print(id(n))#140312184155336
updateList(n)
print(n)#[ 
5,6,10 ] print(id(n))#140312184155336

從上面的例子我們可以看到,我們通過引用調(diào)用了列表,因此對原始列表本身進行了更改。

讓我們看看另一個例子:

def updateNumber(n):
    print(id(n))
    n + = 10
b = 5 
print(id(b))#10055680 
updateNumber(b)#10055680 
print(b)#5

在上面的例子中,同一個對象被傳遞給函數(shù),但即使對象是相同的,變量值也不會改變。這被稱為按價值傳遞 。那么到底發(fā)生了什么?當函數(shù)調(diào)用該值時,只傳遞該變量的值,而不傳遞該對象本身。所以引用該對象的變量不會改變,但對象本身正在改變,但僅在函數(shù)范圍內(nèi)。因此,這種變化沒有體現(xiàn)出來。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41828.html

相關(guān)文章

  • 可變對象與不可變對象

    摘要:不可變對象不允許對自身內(nèi)容進行修改。因為他們說到不可變對象時用的是賦值,而說到可變對象又用了的索引等方法,這根本是兩碼事?;谶@一設(shè)定,兩者在功能上的最大區(qū)別就是不可變對象可以作為字典的鍵,而可變對象不行。 前陣子我們聊了下函數(shù)的參數(shù)傳遞以及變量賦值的一些內(nèi)容:關(guān)于函數(shù)參數(shù)傳遞,80%人都錯了 簡單回顧下要點: 1. Python 中的變量不是裝有對象的 容器 ,而是貼在對象上的 標簽...

    jay_tian 評論0 收藏0
  • python程序員的基本素養(yǎng)--你從沒見過的Python變量引用

    摘要:變量在我們的編程中是最基礎(chǔ)的概念,它就相當于我們蓋大樓用的磚塊一樣不可或缺。理解變量的運行方式至關(guān)重要。雖然他們的食物是一樣的。但是,像這樣這樣并沒有新建對象,而是將的引用傳遞給了,他們都指向一個對象。這個就是的垃圾回收機制。 變量在我們的編程中是最基礎(chǔ)的概念,它就相當于我們蓋大樓用的磚塊一樣不可或缺。理解變量...

    不知名網(wǎng)友 評論0 收藏0
  • python_bomb----數(shù)據(jù)類型總結(jié)

    摘要:數(shù)據(jù)類型有數(shù)字,字符串,值,列表,元組,集合,字典可變與不可變可變與不可變的區(qū)別對這個數(shù)據(jù)類型進行增刪改差時,數(shù)據(jù)存儲地址不變,不會開辟新的空間可變不開辟新空間不可變會改變內(nèi)存地址不可變數(shù)據(jù)類型數(shù)字,字符串,值,元組可變數(shù)據(jù)類型列表,集合, 數(shù)據(jù)類型 有:數(shù)字,字符串,bool值,列表,元組,集合,字典 可變與不可變 可變與不可變的區(qū)別:對這個數(shù)據(jù)類型進行增刪改差時,數(shù)據(jù)存儲地址不變,...

    dkzwm 評論0 收藏0
  • 經(jīng)驗拾憶(純手工)=> Python基本數(shù)據(jù)類型

    摘要:不要疑惑,告訴你答案這個代表正負號的正。雖然一點技術(shù)含量沒有,但是你要懂序列也許叫可迭代對象更為合適,但是我喜歡叫序列。 數(shù)據(jù)結(jié)構(gòu) 可變類型與不可變類型(重頭戲) 基操: 可變類型:[], {} # 可增刪改 查 不可變類型: int float str () # 無法增刪改, 只可查 升操: + 與...

    Andrman 評論0 收藏0
  • python深拷貝與淺拷貝

    摘要:之前關(guān)于的作用域賦值參數(shù)傳遞,我們接連談了幾篇文章全菊變量和菊部變量關(guān)于函數(shù)參數(shù)傳遞,人都錯了可變對象與不可變對象今天我們依然要就相關(guān)話題繼續(xù)下去。這是由于它們是不可變對象,不存在被修改的可能,所以拷貝和賦值是一樣的。 之前關(guān)于 Python 的作用域、賦值、參數(shù)傳遞,我們接連談了幾篇文章: 全菊變量和菊部變量 關(guān)于函數(shù)參數(shù)傳遞,80%人都錯了 可變對象與不可變對象 今天我們依然要...

    ideaa 評論0 收藏0

發(fā)表評論

0條評論

wizChen

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<