簡體   English   中英

如何在while循環中使函數更改變量?

[英]How to make a function change variables while in a while loop?

def lol(done, really_done):
    done = done + 1
    print(done)
    if done == 10:
        really_done = True

really_done = False
while really_done == False:
    done = 0
    lol(done, really_done)

因此,每當我運行此代碼時,它都不會更改done的值,它始終保持為1。我希望將其更改為10並停止while循環。 我只想要這種類型的模塊。

普遍的問題是您希望在對lol調用中保存donereally_done的狀態。 有幾種方法可以做到這一點,所以我會嘗試另一種方法。

保持函數狀態的常見方法是使用類:

class Lol:

    def __init__(self, done=0, max_done=10):
        self.done = done
        self.max_done = max_done

    @property
    def really_done(self):
        self.done >= self.really_done

    def lol(self):
        self.done += 1

lol = Lol()
while not lol.really_done:
    lol.lol()

really_done內部變量lol功能和really_done在模塊級變量生活在不同的范圍 (通常也稱為命名空間 )。 前者是局部變量 ,后者是全局變量

def lol(done, really_done):
    done = done + 1               ---+
    print(done)                      |
    if done == 10:                   +--- the local scope (inside a `def`)
        really_done = True        ---+

really_done = False               ---+
while really_done == False:          |
    done = 0                         +--- the GLOBAL scope 
    lol(done, really_done)        ---+

由於本地作用域與GLOBAL范圍是隔離的,因此無法向您希望退出的while循環發出信號。 取而代之的是,該函數需要通過使用返回值向調用方發送信號,告知您已完成操作:

def lol(done, really_done):
    done = done + 1
    print(done)
    if done == 10:
        really_done = True
    return done, really_done

done = 0
really_done = False
while really_done == False:
    done, really_done = lol(done, really_done)

使用返回值允許將來自本地作用域(函數名稱空間)的信息傳遞回全局作用域(模塊名稱空間)。 這類似於將參數傳遞給函數的方式,該方法允許將外部作用域(模塊名稱空間)中的信息作為本地作用域(功能名稱空間)中的信息接收。

您每次運行循環時都將重置done的值。 不僅如此-您還嘗試將值更改為全局變量,而是更改簡單參數的值,因此lol(done)實際上並沒有做任何事情。

如果要將其保留在函數中,則應使用關鍵字global來指示您正在使用全局變量:

def lol():
    global done
    global really_done

    done += 1
    really_done = done == 10

really_done = False
done = 0
while not really_done:
    lol()

這應該可以,但是它是不好的代碼-如果不是真正的需要,則不應該使用global 無需更改很多代碼,可以使用return來保持代碼更整潔:

def lol(done, really_done):
    done += 1
    really_done = done == 10

    return done, really_done

really_done = False
done = 0
while not really_done:
   done, really_done = lol(done, really_done)

這使它更好。 但是,我們可以通過用for循環一個range來解決所有問題:

done = 0
for n in range(10):
    done += 1
print(done)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM