代码如下:
import random, stringclass c(object): passdef dangerfunction(msg, l = [], b = {}, c = c()): print msg, ‘-‘*10 print l, b, c.__dict__ l.append(1) b[random.choice(string.ascii_lowercase)] = ” c.__dict__[random.choice(string.ascii_lowercase)] = “” print l, b, c.__dict__dangerfunction(‘1’)dangerfunction(‘2’)dangerfunction(‘3’)print ‘-‘*20def safefunction(msg, l = none, b = none, c = none): if not l: l = [] if not b: b = {} if not c: c = c() print msg, ‘-‘*10 print l, b, c.__dict__ l.append(1) b[random.choice(string.ascii_lowercase)] = ” c.__dict__[random.choice(string.ascii_lowercase)] = “” print l, b, c.__dict__safefunction(‘1’)safefunction(‘2’)safefunction(‘3’)
运行结果:
代码如下:
1 ———-[] {} {}[1] {‘q’: ”} {‘p’: ”}2 ———-[1] {‘q’: ”} {‘p’: ”}[1, 1] {‘q’: ”, ‘a’: ”} {‘p’: ”, ‘g’: ”}3 ———-[1, 1] {‘q’: ”, ‘a’: ”} {‘p’: ”, ‘g’: ”}[1, 1, 1] {‘q’: ”, ‘a’: ”, ‘w’: ”} {‘p’: ”, ‘w’: ”, ‘g’: ”}——————–1 ———-[] {} {}[1] {‘k’: ”} {‘l’: ”}2 ———-[] {} {}[1] {‘r’: ”} {‘c’: ”}3 ———-[] {} {}[1] {‘q’: ”} {‘h’: ”}
由dangerfunction打印出来的结果来看,缺省值为 [], (), class再下次调用时,如果继续参数空缺而使用缺省值,那么缺省值延续上次引用。
可能打印无任何标志无法看清楚,加上文字应该会简单很多。
代码如下:
# -*- coding: utf-8 -*-import random, stringclass c(object): passdef dangerfunction(msg, l = [], b = {}, c = c()): print msg, ‘-‘*10 print u’操作前’, l, b, c.__dict__ l.append(1) b[random.choice(string.ascii_lowercase)] = ” c.__dict__[random.choice(string.ascii_lowercase)] = “” print u’操作后’, l, b, c.__dict__dangerfunction(‘1’)dangerfunction(‘2’)dangerfunction(‘3’)print ‘-‘ * 10, u’我是分隔符’, ‘-‘ * 10def safefunction(msg, l = none, b = none, c = none): if not l: l = [] if not b: b = {} if not c: c = c() print msg, ‘-‘*10 print u’操作前’, l, b, c.__dict__ l.append(1) b[random.choice(string.ascii_lowercase)] = ” c.__dict__[random.choice(string.ascii_lowercase)] = “” print u’操作后’,l, b, c.__dict__safefunction(‘1’)safefunction(‘2’)safefunction(‘3’)
代码如下:
1 ———-操作前 [] {} {}操作后 [1] {‘m’: ”} {‘v’: ”}2 ———-操作前 [1] {‘m’: ”} {‘v’: ”}操作后 [1, 1] {‘i’: ”, ‘m’: ”} {‘g’: ”, ‘v’: ”}3 ———-操作前 [1, 1] {‘i’: ”, ‘m’: ”} {‘g’: ”, ‘v’: ”}操作后 [1, 1, 1] {‘i’: ”, ‘s’: ”, ‘m’: ”} {‘s’: ”, ‘g’: ”, ‘v’: ”}———- 我是分隔符 ———-1 ———-操作前 [] {} {}操作后 [1] {‘e’: ”} {‘q’: ”}2 ———-操作前 [] {} {}操作后 [1] {‘d’: ”} {‘s’: ”}3 ———-操作前 [] {} {}操作后 [1] {‘m’: ”} {‘k’: ”}