pythonä¸ï¼Œä¸‡ç‰©çš†å¯¹è±¡ã€‚pythonä¸ä¸å˜åœ¨æ‰€è°“çš„ä¼ å€¼è°ƒç”¨ï¼Œä¸€åˆ‡ä¼ é€’çš„éƒ½æ˜¯å¯¹è±¡çš„å¼•ç”¨ï¼Œä¹Ÿå¯ä»¥è®¤ä¸ºæ˜¯ä¼ å€ã€‚
pythonä¸ï¼Œå¯¹è±¡åˆ†ä¸ºå¯å˜(mutable)å’Œä¸å¯å˜(immutable)两ç§ç±»åž‹ã€‚
元组(tuple)ã€æ•°å€¼åž‹ï¼ˆnumber)ã€å—符串(string)å‡ä¸ºä¸å¯å˜å¯¹è±¡ï¼Œè€Œå—典型(dictionary)和列表型(list)的对象是å¯å˜å¯¹è±¡ã€‚
对于å¯å˜å¯¹è±¡æ¥è¯´ï¼Œä¼ 倿˜¯å¯ä»¥æ”¹å˜åŽŸå¯¹è±¡çš„å€¼çš„ï¼Œå¯¹äºŽä¸å¯å˜å¯¹è±¡æ¥è¯´ï¼Œä¼ å€ç›¸å½“于多了一个指å‘该值(ä¸å¯å˜ï¼‰çš„æŒ‡é’ˆ
ä¸å¯å˜å¯¹è±¡
å¯å˜å¯¹è±¡
下é¢è¿™ä¸€æ®µç¨‹åº
#! /usr/bin/env python
# -*- coding: utf-8 -*-
class demo_list:
def __init__(self, l=[]):
self.l = l
def add(self, ele):
self.l.append(ele)
def appender(ele):
obj = demo_list()
obj.add(ele)
print obj.l
if __name__ == "__main__":
for i in range(5):
appender(i)
输出结果是多少?
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
è€Œä¸æ˜¯æƒ³è±¡çš„
[0]
[1]
[2]
[3]
[4]
è€Œå¦‚æžœæƒ³è¾¾åˆ°ç¬¬äºŒç§æ•ˆæžœï¼Œåªéœ€å°†obj = demo_list()
改为obj = demo_list(l=[])
å³å¯
官方文档ä¸çš„一å¥è¯ï¼š
Default values are computed once, then re-used.
默认值是被é‡å¤ä½¿ç”¨çš„
Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed†value is used for each call.
æ‰€ä»¥å½“é»˜è®¤å‚æ•°å€¼æ˜¯å¯å˜å¯¹è±¡çš„æ—¶å€™ï¼Œé‚£ä¹ˆæ¯æ¬¡ä½¿ç”¨è¯¥é»˜è®¤å‚数的时候,其实更改的是åŒä¸€ä¸ªå˜é‡
当python执行defè¯å¥æ—¶ï¼Œå®ƒä¼šæ ¹æ®ç¼–译好的函数体å—节ç 和命å空间ç‰ä¿¡æ¯æ–°å»ºä¸€ä¸ªå‡½æ•°å¯¹è±¡ï¼Œå¹¶ä¸”ä¼šè®¡ç®—é»˜è®¤å‚æ•°çš„值。函数的所有构æˆè¦ç´ å‡å¯é€šè¿‡å®ƒçš„属性æ¥è®¿é—®ï¼Œæ¯”如å¯ä»¥ç”¨funcnameå±žæ€§æ¥æŸ¥çœ‹å‡½æ•°çš„åç§°ã€‚æ‰€æœ‰é»˜è®¤å‚æ•°å€¼åˆ™å˜å‚¨åœ¨å‡½æ•°å¯¹è±¡çš„defaults_属性ä¸ï¼Œå®ƒçš„å€¼ä¸ºä¸€ä¸ªåˆ—è¡¨ï¼Œåˆ—è¡¨ä¸æ¯ä¸€ä¸ªå…ƒç´ å‡ä¸ºä¸€ä¸ªé»˜è®¤å‚数的值
å…¶ä¸é»˜è®¤å‚数相当于函数的一个属性
Functions in Python are first-class objects, and not only a piece of code.
我们å¯ä»¥è¿™æ ·è§£è¯»ï¼šå‡½æ•°ä¹Ÿæ˜¯å¯¹è±¡ï¼Œå› æ¤å®šä¹‰çš„æ—¶å€™å°±è¢«æ‰§è¡Œï¼Œé»˜è®¤å‚数是函数的属性,它的值å¯èƒ½ä¼šéšç€å‡½æ•°è¢«è°ƒç”¨è€Œæ”¹å˜ã€‚其他对象ä¸éƒ½æ˜¯å¦‚æ¤å—?
使用å¯å˜å‚数作为默认值å¯èƒ½å¯¼è‡´æ„料之外的行为。为了防æ¢å‡ºçŽ°è¿™ç§æƒ…况,最好使用None值,并且在åŽé¢åŠ ä¸Šæ£€æŸ¥ä»£ç
def __init__(self, l=None):
if not l:
self.l = []
else:
self.l = l
在这里将None用作å ä½ç¬¦æ¥æŽ§åˆ¶å‚æ•°l的默认值。ä¸è¿‡ï¼Œæœ‰æ—¶å€™å‚数值å¯èƒ½æ˜¯ä»»æ„对象(包括None),这时候就ä¸èƒ½å°†None作为å ä½ç¬¦ã€‚ä½ å¯ä»¥å®šä¹‰ä¸€ä¸ªobject对象作为å ä½ç¬¦ï¼Œå¦‚下é¢ä¾‹å:
sentinel = object()
def func(var=sentinel):
if var is sentinel:
pass
else:
print var
Python cookbookä¸ä¹Ÿæåˆ°äº†è¿™ä¸ªæ–¹æ³•,为了é¿å…对æ¯ä¸€ä¸ªå‡½æ•°ä¸æ¯ä¸€ä¸ªå¯èƒ½ä¸ºNone的对象进行一个if not l
的判æ–ï¼Œä½¿ç”¨å¯æ›´ä¼˜é›…的修饰器方法
import copy
def freshdefault(f):
fdefaults = f.func_defaults
def refresher(*args,**kwds):
f.func_defaults = deepcopy(fdefaults)
return f(*args,**kwds)
return refresh
这段代ç ä¹Ÿå†æ¬¡è®¤è¯äº†é»˜è®¤å‚数是函数的一个属性这一事实
pythonä¸å‡½æ•°çš„默认值åªä¼šè¢«æ‰§è¡Œä¸€æ¬¡ï¼Œ(å’Œé™æ€å˜é‡ä¸€æ ·ï¼Œé™æ€å˜é‡åˆå§‹åŒ–也是被执行一次)。Pythonå¯ä»¥é€šè¿‡å‡½æ•°çš„默认值æ¥å®žçް陿€å˜é‡çš„功能。
[1]陷阱ï¼python傿•°é»˜è®¤å€¼
[2]python tips - 注æ„å‡½æ•°å‚æ•°çš„默认值
[3]Default Parameter Values in Python