創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
十余年的點(diǎn)軍網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整點(diǎn)軍建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“點(diǎn)軍網(wǎng)站設(shè)計(jì)”,“點(diǎn)軍網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。怎么在Python中模擬實(shí)現(xiàn)指針?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
在Python中模擬實(shí)現(xiàn)指針
因?yàn)镻ython中的指針本身不存在,但并不意味著無(wú)法使用指針。實(shí)際上有多種方法可以在Python中模擬指針。
這里用兩種方法來(lái)實(shí)現(xiàn):
使用可變類型作為指針【Python中的變量】
使用自定義Python對(duì)象【Python中的對(duì)象】
使用可變類型作為指針
您已經(jīng)了解了可變類型。因?yàn)檫@些對(duì)象是可變的,所以您可以將它們視為指向模擬指針行為的指針。假設(shè)您要復(fù)制以下c代碼:
void add_one (int * x ) { * x + = 1 ; }
此代碼采用指向整數(shù)(*x)的指針,然后將該值遞增1。這是一個(gè)練習(xí)代碼的主要功能:
#include <stdio.h> int main(void) { int y = 2337; printf("y = %d\n", y); add_one(&y); printf("y = %d\n", y); return 0; }
在上面的代碼中,分配2337給y,打印出當(dāng)前值,將值遞增1,然后打印出修改后的值。執(zhí)行此代碼的輸出如下:
y = 2337 y = 2338
在Python中復(fù)制此類行為的一種方法是使用可變類型。考慮使用列表并修改第一個(gè)元素:
>>> def add_one (x ): ... x [ 0 ] + = 1 ... >>> y = [ 2337 ] >>> add_one (y ) >>> y [ 0 ] 2338
在這里,add_one(x)訪問(wèn)第一個(gè)元素并將其值增加1。使用一種list方法,最終結(jié)果似乎已修改了該值。那么Python中的指針確實(shí)存在嗎?好吧,這是唯一可能的,因?yàn)樗黮ist是一種可變類型。如果您嘗試使用a tuple,則會(huì)收到錯(cuò)誤消息:
>>> z = (2337,) >>> add_one(z) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in add_one TypeError: 'tuple' object does not support item assignment
上面的代碼演示了這tuple是不可變的。因此,它不支持項(xiàng)目分配。list不是唯一可變的類型。在Python中模仿指針的另一種常見(jiàn)方法是使用a dict。
假設(shè)您有一個(gè)應(yīng)用程序,您希望每次發(fā)生有趣事件時(shí)都要跟蹤它。實(shí)現(xiàn)此目的的一種方法是創(chuàng)建一個(gè)dict并使用其中一個(gè)項(xiàng)目作為計(jì)數(shù)器:
>>> counters = {"func_calls": 0} >>> def bar(): ... counters["func_calls"] += 1 ... >>> def foo(): ... counters["func_calls"] += 1 ... bar() ... >>> foo() >>> counters["func_calls"] 2
在此示例中,counters字典用于跟蹤函數(shù)調(diào)用的數(shù)量。打電話后foo(),計(jì)數(shù)器已2按預(yù)期增加。所有因?yàn)閐ict是可變的。
請(qǐng)記住,這只是模擬指針行為,并不直接映射到C或C ++中的真指針。也就是說(shuō),這些操作比在C或C ++中更昂貴。
使用Python對(duì)象
該dict選項(xiàng)是在Python中模擬指針的好方法,但有時(shí)記住您使用的密鑰名稱會(huì)很繁瑣。如果您在應(yīng)用程序的各個(gè)部分使用字典,則尤其如此。這是自定義Python類可以真正幫助的地方。
要構(gòu)建最后一個(gè)示例,假設(shè)您要跟蹤應(yīng)用程序中的指標(biāo)。創(chuàng)建一個(gè)類是抽象討厭細(xì)節(jié)的好方法:
class Metrics (object ): def __init __ (self ): self 。_metrics = { “func_calls” : 0 , “cat_pictures_served” : 0 , }
此代碼定義了一個(gè)Metrics類。該類仍然使用a dict來(lái)保存實(shí)際數(shù)據(jù),該數(shù)據(jù)位于_metrics成員變量中。這將為您提供所需的可變性。現(xiàn)在您只需要能夠訪問(wèn)這些值。一個(gè)很好的方法是使用屬性:
class Metrics(object): # ... @property def func_calls(self): return self._metrics["func_calls"] @property def cat_pictures_served(self): return self._metrics["cat_pictures_served"]
這段代碼利用了@property。如果您不熟悉裝飾器,可以在Python裝飾器上查看這個(gè)Primer。@property這里的裝飾器允許您訪問(wèn)func_calls,cat_pictures_served就像它們是屬性一樣:
>>> metrics = Metrics() >>> metrics.func_calls 0 >>> metrics.cat_pictures_served 0
您可以將這些名稱作為屬性訪問(wèn)這一事實(shí)意味著您抽象出這些值在a中的事實(shí)dict。您還可以更明確地了解屬性的名稱。當(dāng)然,您需要能夠增加這些值:
class Metrics(object): # ... def inc_func_calls(self): self._metrics["func_calls"] += 1 def inc_cat_pics(self): self._metrics["cat_pictures_served"] += 1
這里再介紹兩種新方法:
inc_func_calls() inc_cat_pics()
這些方法會(huì)修改指標(biāo)中的值dict。您現(xiàn)在有一個(gè)類可以修改,就像您正在修改指針一樣:
>>> metrics = Metrics() >>> metrics.inc_func_calls() >>> metrics.inc_func_calls() >>> metrics.func_calls 2
在這里,您可以在應(yīng)用程序中的各個(gè)位置訪問(wèn)func_calls和調(diào)用inc_func_calls(),并在Python中模擬指針。當(dāng)您需要在應(yīng)用程序的各個(gè)部分中頻繁使用和更新指標(biāo)時(shí),這非常有用。
注意:特別是在這個(gè)類中,make inc_func_calls()和inc_cat_pics()explicit而不是使用@property.setter阻止用戶將這些值設(shè)置為任意int或無(wú)效的值,如dict。
class Metrics(object): def __init__(self): self._metrics = { "func_calls": 0, "cat_pictures_served": 0, } @property def func_calls(self): return self._metrics["func_calls"] @property def cat_pictures_served(self): return self._metrics["cat_pictures_served"] def inc_func_calls(self): self._metrics["func_calls"] += 1 def inc_cat_pics(self): self._metrics["cat_pictures_served"] += 1
關(guān)于怎么在Python中模擬實(shí)現(xiàn)指針問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
網(wǎng)站欄目:怎么在Python中模擬實(shí)現(xiàn)指針-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://muchs.cn/article10/dsgjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站營(yíng)銷、定制開(kāi)發(fā)、網(wǎng)站維護(hù)、移動(dòng)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容