面试中的Python任务说明

敬礼,哈布里沃派! 期望在“ 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] 


结论


因此,我在面试中提出了最受欢迎的测试任务之一。 这篇文章旨在表明您不能总是依靠自己的直觉,就像我自己做的:-)一样。

我们希望此翻译对您有用。 传统上,我们在等待评论,并在课程中与您见面。

Source: https://habr.com/ru/post/zh-CN459518/


All Articles