2017-06-04 58 views
0

假設:在多次函數調用之後保持變量的生命期?

def myfunc(x): 
    my_list = [] 
    list.append(x) 

是有關鍵詞來從被再分配停止一個變量(my_list)? 讓我們假設NA是關鍵字:

def myfunc(x): 
    NA listv = [] 
    list.append(x) 

以這樣的方式,該線將被讀取,而不是重新分配但對於每個函數調用的變量仍然活躍追加新的價值觀。我知道GLOBAL變量,但我只想知道是否存在關鍵字!

+0

如果你想追加*一個新值,追加它,並且如果你想要一個在函數調用中保持其值的變量,不要使它成爲本地函數。 – user2357112

+0

這裏沒有追加到列表 –

+0

[在Python中使用「全局」關鍵字]的可能重複(https://stackoverflow.com/questions/4693120/use-of-global-keyword-in-python) –

回答

0

我猜你正在尋找的東西等同於Java中的final關鍵字。簡而言之,沒有這樣的關鍵字。 Python的態度是「如果你不想修改它,只是不要修改它,我不會阻止你」。

然而,你可以通過你的課堂上的一些調整來模仿類似的東西。

class MyFinalVariablesClass: 
    def __setattr__(self, attr, value): 
     # if it already has this attribute, complain ! 
     if hasattr(self, attr): 
      raise Exception("Attempting to alter read-only value") 

     self.__dict__[attr] = value 

或者在您的變量的情況下(沒有測試過)

class WriteOnceReadWhenever: 
    def __setattr__(self, attr, value): 
     if attr == 'my_list' and hasattr(self, attr): 
      raise Exception("Attempting to alter read-only value") 
     self.__dict__[attr] = value 
0

我相信你正在尋找的行爲幾乎完全論點Python的可變默認工作:僅在實例化功能定義。

def myfunc(x,*args,my_list=[]): 
    my_list.append(x) 

*args將保護名單由錯誤地傳遞第二個參數被覆蓋。

0

沒有關鍵字來做到這一點。有解決方法(如可變的默認參數),但有更好的方法來實現相同的事情。

的exaple您可以將變量設置爲功能屬性:

def my_func(): 
    my_func.my_list.append(1) 

my_func.my_list = [] 

然而,這是這樣做的只是一個哈克的方式:

class MyFuncFactory: 
    def __init__(self): 
     self.my_list = [] 
    def __call__(self): 
     self.my_list.append(1) 

因此,你可能會更好寫一個類的而不是這種情況下的功能。


有時你可以使用一個nonlocal變量。例如定義key功能,要求國家我平時寫的東西,如:

def my_key_builder(): 
    some_state = 0 

    def key_function(arg): 
     nonlocal some_state 
     some_state += 1 
     return some_state % 2 
    return key_function 

for x in sorted(a_list, key=my_key_builder()): 
    print(x) 

使用nonlocal而不是global(或可變默認參數)允許您使用功能鍵多次。但是,如果功能變得稍大,使用類可能是最好的選擇。

相關問題