敬礼,哈布里沃派! 期望在
“ Web开发人员in Python”课程中启动一个新线程时,我们希望分享一个新的有用的翻译。 走吧
在再次进行了几次面试并通过了测试任务后,我注意到面试官喜欢以下任务。
def f(x, l=[]): for i in range(x): l.append(i * i) return l >>> f(2) >>> f(3, [0, 1, 2]) >>> f(3)
问题:此代码将输出什么?
前两行的输出非常明显,但对我来说,第三行
f(3)
的结果似乎并不那么直接。 让我们看看函数
f
初始化后会发生什么。 要运行此代码,我将使用
IPython 。
>>> f <function __main__.f(x, l=[])> >>> f.__defaults__ ([],)
从执行
f.__defaults__
的结果中看到的空列表是功能代码中的变量
l
。
>>> f(2) [0, 1]
没什么特别的
>>> f <function __main__.f(x, l=[0, 1])> >>> f.__defaults__ ([0, 1],)
但是! 现在我们看到变量
l
具有值
[0, 1]
由于 Python中列表对象
的可变性以及将函数的参数作为引用传递的
缘故 。
>>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1])>
没什么特别的。 只是将
list
对象作为变量
l
传递。
>>> f(3) [0, 1, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1, 0, 1, 4])>
现在最有趣。 当您运行
f(3)
,Python不使用功能代码中定义的空列表,而是将
l
变量与
f.__defaults__ ([0, 1])
。
聚苯乙烯如果需要一个在每次调用后使用空列表的函数,则应使用类似的东西(将
'l'
的值设置为
'None'
)。
def f(x, l=None): if l is None: l = [] for i in range(x): l.append(i * i) return l >>> f(2) [0, 1] >>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f(3) [0, 1, 4]
结论
因此,我在面试中提出了最受欢迎的测试任务之一。 这篇文章旨在表明您不能总是依靠自己的直觉,就像我自己做的:-)一样。
我们希望此翻译对您有用。 传统上,我们在等待评论,并在
课程中与您见面。