Python 手册的 Tutorial.pdf 中 “ 4.7.1 参数默认值” 有如下的例子:
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
这将打印出
[1]
[1, 2]
[1, 2, 3]
如果你不想要在后续调用之间共享默认值,你可以这样写这个函数:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
我家高中生刚学编程,把程序改为如下进行测试,问我 f3 和 f1 的 L 到底差别在哪儿,把我搞懵了,哪个能给出一个简单、初学编程的人听得懂的解释(我只能给他解释 f1 的 L 是可变对象,f3 的 L 是不可变对象?)
def f1(a, L=[]):
print("id(L) = ", id(L))
print("L = ", L)
print()
L.append(a)
return L
def f3(a, L=None):
print("id(L) = ", id(L))
print("L = ", L)
if L is None: # 为何每次成立?
L=[]
print("id(L) = ", id(L))
print()
L.append(a)
return L
if __name__ == "__main__":
f1(1)
f1(2)
f1(3)
print('-'*40)
f3(1)
f3(2)
f3(3)
执行时打印出:
id(L) = 2405815737608
L = []
id(L) = 2405815737608
L = [1]
id(L) = 2405815737608
L = [1, 2]
----------------------------------------
id(L) = 1983976656
L = None
id(L) = 2405815759368
id(L) = 1983976656
L = None
id(L) = 2405815759368
id(L) = 1983976656
L = None
id(L) = 2405815759368
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.