怎么在Python中模擬實(shí)現(xiàn)指針-創(chuàng)新互聯(lián)

創(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)

手機(jī)網(wǎng)站建設(shè)