摘要:關(guān)于函數(shù)默認(rèn)參數(shù)為等容器的不刷新問(wèn)題當(dāng)我們這樣寫函數(shù)結(jié)果我們會(huì)發(fā)現(xiàn)函數(shù)只是會(huì)在函數(shù)定義的時(shí)候,會(huì)利用來(lái)初始化,以后的使用都不會(huì)再次初始化這個(gè)函數(shù)解決利用裝飾器,每次調(diào)用默認(rèn)參數(shù)列表內(nèi)容,而非引用結(jié)果補(bǔ)充這里函數(shù)定義之后,解釋器會(huì)去掃描這些定
關(guān)于函數(shù)默認(rèn)參數(shù)為{}等容器的不刷新
問(wèn)題:當(dāng)我們這樣寫函數(shù):
def append_item(a = 1, b = []): b.append(a) print b append_item(a = 2) append_item(a = 3)
結(jié)果:
[2] [2, 3]
我們會(huì)發(fā)現(xiàn)函數(shù)只是會(huì)在函數(shù)定義的時(shí)候,會(huì)利用default來(lái)初始化, 以后的使用都不會(huì)再次初始化這個(gè)函數(shù)
解決:
利用裝飾器,每次調(diào)用deepcopy默認(rèn)參數(shù)列表 import copy def flush(f): function_args_default = f.func_defaults def wrapper(*args, **kwargs): f.func_defaults = copy.deepcopy(function_args_default) #deepcopy內(nèi)容,而非copy引用 return f(*args, **kwargs) return wrapper append_item_copy(a = 2) append_item_copy(a = 3)
結(jié)果:
[2] [3]
補(bǔ)充:
這里函數(shù)定義之后, python解釋器會(huì)去掃描這些定義, 之后不會(huì)有這些初始化。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37846.html
摘要:實(shí)現(xiàn)一個(gè)簡(jiǎn)單的裝飾器輸出被裝飾函數(shù)的運(yùn)行時(shí)間簡(jiǎn)單運(yùn)用運(yùn)行結(jié)果運(yùn)行過(guò)程中,首先輸出裝飾器函數(shù)中的內(nèi)容被裝飾函數(shù)運(yùn)行時(shí)間長(zhǎng)度函數(shù)名稱和實(shí)際參數(shù)計(jì)算結(jié)果然后得到最終的計(jì)算結(jié)果。 函數(shù)裝飾器 函數(shù)裝飾器用于在源碼中標(biāo)記函數(shù), 以某種方式增強(qiáng)函數(shù)的行為,這是一個(gè)強(qiáng)大的功能。 函數(shù)裝飾器是一個(gè)可調(diào)用對(duì)象,其參數(shù)是另外一個(gè)函數(shù),即被裝飾函數(shù)。裝飾器可能處理被裝飾函數(shù),然后將其返回,或者將其替換成另一...
摘要:初步認(rèn)識(shí)裝飾器函數(shù)裝飾器用于在源代碼中標(biāo)記函數(shù),以某種方式增強(qiáng)函數(shù)的行為。函數(shù)裝飾器在導(dǎo)入模塊時(shí)立即執(zhí)行,而被裝飾的函數(shù)只在明確調(diào)用時(shí)運(yùn)行。只有涉及嵌套函數(shù)時(shí)才有閉包問(wèn)題。如果想保留函數(shù)原本的屬性,可以使用標(biāo)準(zhǔn)庫(kù)中的裝飾器。 《流暢的Python》筆記本篇將從最簡(jiǎn)單的裝飾器開(kāi)始,逐漸深入到閉包的概念,然后實(shí)現(xiàn)參數(shù)化裝飾器,最后介紹標(biāo)準(zhǔn)庫(kù)中常用的裝飾器。 1. 初步認(rèn)識(shí)裝飾器 函數(shù)裝飾...
摘要:普通裝飾器函數(shù)計(jì)算函數(shù)的運(yùn)行時(shí)間黑名單過(guò)濾測(cè)試網(wǎng)絡(luò)請(qǐng)求的響應(yīng)時(shí)間初始裝飾閉包函數(shù)判斷的路徑是否存在,如果不存在,則追加已取消下載此已在黑名單中獲取開(kāi)始請(qǐng)求的時(shí)間執(zhí)行時(shí)間返回一個(gè)包裝函數(shù)包裝被裝飾函數(shù)的參數(shù)列表開(kāi)始 普通裝飾器函數(shù) 計(jì)算函數(shù)的運(yùn)行時(shí)間 import requests import time import re # 黑名單 filter_urls = [www.hao12...
摘要:函數(shù)裝飾器和閉包嚴(yán)格來(lái)說(shuō),裝飾器只是語(yǔ)法糖。何時(shí)執(zhí)行裝飾器它們?cè)诒谎b飾的函數(shù)定義之后立即運(yùn)行。裝飾器突出了被裝飾的函數(shù)的作用,還便于臨時(shí)禁用某個(gè)促銷策略只需把裝飾器注釋掉。 函數(shù)裝飾器和閉包 嚴(yán)格來(lái)說(shuō),裝飾器只是語(yǔ)法糖。如前所示,裝飾器可以像常規(guī)的可調(diào)用對(duì)象那樣調(diào)用,其參數(shù)是另一個(gè)函數(shù)。有時(shí),這樣做更方便,尤其是做元編程(在運(yùn)行時(shí)改變程序的行為)時(shí)。 Python何時(shí)執(zhí)行裝飾器 它們?cè)?..
摘要:探究多個(gè)裝飾器執(zhí)行順序裝飾器是用于封裝函數(shù)或代碼的工具,網(wǎng)上可以搜到很多文章可以學(xué)習(xí),我在這里要討論的是多個(gè)裝飾器執(zhí)行順序的一個(gè)迷思。這時(shí)候你該知道為什么輸出結(jié)果會(huì)是那樣,以及對(duì)裝飾器執(zhí)行順序?qū)嶋H發(fā)生了什么有一定了解了吧。 探究多個(gè)裝飾器執(zhí)行順序 裝飾器是Python用于封裝函數(shù)或代碼的工具,網(wǎng)上可以搜到很多文章可以學(xué)習(xí),我在這里要討論的是多個(gè)裝飾器執(zhí)行順序的一個(gè)迷思。 疑問(wèn) 大部...
閱讀 3759·2021-11-25 09:43
閱讀 2191·2021-11-23 10:13
閱讀 823·2021-11-16 11:44
閱讀 2369·2019-08-29 17:24
閱讀 1384·2019-08-29 17:17
閱讀 3480·2019-08-29 11:30
閱讀 2584·2019-08-26 13:23
閱讀 2345·2019-08-26 12:10