您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹怎么使用Python中變量,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
什么是變量?
Python變量與C或C ++中的變量根本不同。事實上,Python甚至沒有變量。Python有名稱,而不是變量。
這可能看起來很迂腐,而且大多數(shù)情況下都是如此。大多數(shù)時候,將Python名稱視為變量是完全可以接受的,但理解差異很重要。當(dāng)您在Python中實現(xiàn)棘手的指針時尤其如此。
為了幫助推動差異,可以了解變量如何在C中工作,它們代表什么,然后將其與名稱在Python中的工作方式進行對比。
C中的變量
假設(shè)您有以下代碼來定義變量x:
int x = 2337 ;
這一行代碼在執(zhí)行時有幾個不同的步驟:
為整數(shù)分配足夠的內(nèi)存
將值分配2337給該內(nèi)存位置
指示x指向該值
以簡化的內(nèi)存視圖顯示,它可能如下所示:
X的內(nèi)存表示(2337)
在這里,您可以看到該變量x具有偽內(nèi)存位置0x7f1和值2337。如果在程序中稍后要更改其值x,則可以執(zhí)行以下操作:
x = 2338 ;
上面的代碼為2338變量分配了一個新的value()x,從而覆蓋了以前的值。這意味著變量x是可變的。更新的內(nèi)存布局顯示新值:
X的新內(nèi)存表示(2338)
請注意,位置x沒有改變,只是值本身。這是一個重要的觀點。這意味著它x 是內(nèi)存位置,而不僅僅是它的名稱。
另一種思考這個概念的方法是在所有權(quán)方面。從某種意義上說,x擁有內(nèi)存位置。x首先,它是一個空盒子,它可以恰好適合一個可以存儲整數(shù)值的整數(shù)。
為值分配值時x,您將在所x擁有的框中放置一個值。如果你想引入一個新的變量(y),你可以添加這行代碼:
int y = x ;
此代碼創(chuàng)建一個名為的新框y,并將值復(fù)制x到框中?,F(xiàn)在內(nèi)存布局將如下所示:
X(2338)和Y(2338)的內(nèi)存表示
注意新的位置0x7f5的y。即使將值x復(fù)制到y(tǒng),變量也會y在內(nèi)存中擁有一些新地址。因此,您可以覆蓋y不影響的值x:
y = 2339 ;
現(xiàn)在內(nèi)存布局將如下所示:
更新了Y(2339)的代表
同樣,你修改的值y,但不是它的位置。此外,您根本沒有影響原始x變量。這與Python名稱的工作方式形成鮮明對比。
Python中的名稱
Python沒有變量。它有名稱。是的,這是一個迂腐點,你當(dāng)然可以隨意使用術(shù)語變量。重要的是要知道變量和名稱之間存在差異。
讓我們從上面的C示例中獲取等效代碼并將其寫在Python中:
>>> x = 2337
與C類似,上面的代碼在執(zhí)行過程中分解為幾個不同的步驟:
創(chuàng)建一個 PyObject
將typecode設(shè)置為整數(shù) PyObject
將值設(shè)置2337為PyObject
創(chuàng)建一個名為 x
指向x新的PyObject
增加的引用計數(shù)PyObject被1
注意:這PyObject與Python不同object。它特定于CPython并表示所有Python對象的基本結(jié)構(gòu)。
PyObject被定義為C結(jié)構(gòu),所以,如果你想知道為什么你不能打電話typecode或refcount直接,其因為你沒有進入結(jié)構(gòu)直接。方法調(diào)用sys.getrefcount()可以幫助獲得一些內(nèi)部。
在內(nèi)存中,它可能看起來像這樣:
Python的內(nèi)存中表示(2337)
您可以看到內(nèi)存布局與之前的C布局截然不同。新創(chuàng)建的Python對象擁有生命中的內(nèi)存,而不是x擁有值2337所在的內(nèi)存塊2337。Python名稱x不像C變量在內(nèi)存中擁有靜態(tài)插槽那樣直接擁有任何內(nèi)存地址x。
如果您嘗試為其分配新值x,可以嘗試以下操作:
>>> x = 2338
這里發(fā)生的事情與C等價物不同,但與Python中的原始綁定沒有太大區(qū)別。
這段代碼:
創(chuàng)建一個新的 PyObject
將typecode設(shè)置為整數(shù) PyObject
設(shè)置值2338的PyObject
點x新PyObject
將new的refcount增加PyObject1
將舊的refcount減少PyObject1
現(xiàn)在在內(nèi)存中,它看起來像這樣:
Python名稱指向新對象(2338)
此圖有助于說明x指向?qū)ο蟮囊?,并且不像以前那樣擁有?nèi)存空間。它還顯示該x = 2338命令不是賦值,而是將名稱綁定x到引用。
此外,前一個對象(持有該2337值)現(xiàn)在位于內(nèi)存中,引用計數(shù)為0,并將被垃圾收集器清理。
您可以y在C示例中引入一個新名稱:
>>> y = x
在內(nèi)存中,您將擁有一個新名稱,但不一定是新對象:
X和Y名稱指向2338
現(xiàn)在,你可以看到一個新的Python對象沒有被創(chuàng)建,只是指向同一個對象的新名稱。此外,對象的refcount增加了一個。您可以檢查對象標(biāo)識是否相同,以確認它們是否相同:
>>> y is x True
上面的代碼表明x和y是相同的對象。不過沒錯:y它仍然是不可改變的。
例如,您可以執(zhí)行以下操作y:
>>> y += 1 >>> y is x False
添加調(diào)用后,將返回一個新的Python對象?,F(xiàn)在,內(nèi)存看起來像這樣:
x name和y命名不同的對象
已創(chuàng)建新對象,y現(xiàn)在指向新對象。有趣的是,這是如果你已經(jīng)綁定到的最終狀態(tài)y,以2339直接:
>>> y = 2339
上述語句導(dǎo)致與添加相同的結(jié)束內(nèi)存狀態(tài)?;仡櫼幌?,在Python中,您不需要分配變量。而是將名稱綁定到引用。
【Python中的對象】
關(guān)于怎么使用Python中變量就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。