有人可以向我解释这个真正基本的Python代码吗?

Nac*_*uel 5 python list python-2.7

最近,我参加了一个Python开发人员职位的面试.以下代码是其中一个问题.我只需要写输出.

def extendList(val,list=[]):
    list.append(val)
    return list

list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')

print "list1 = %s " %list1
print "list2 = %s " %list2
print "list2 = %s " %list3
Run Code Online (Sandbox Code Playgroud)

输出是:

list1 = [10, 'a'] 
list2 = [123] 
list2 = [10, 'a']
Run Code Online (Sandbox Code Playgroud)

我试图理解为什么第一个列表list1具有'a'价值.

编辑

我检查了所有的链接,发现它是一个pygg"gotcha"为begginers,但要感谢答案,不能选择这两个所以我要去第一个.

小智 2

list1因为'a'使用创建的列表extendlist('a')附加到与以下相同的列表中extendList(10)

毫无疑问,这是 Python 处理默认参数及其状态模型的方式细节的结果。您甚至可以认为这是一个错误,因为它违反了闭包属性(如果 Python 的方法应该是闭包的话)。

例如 Ruby 中的等效代码:

def extendList(val, list=[])
  list << val
  return list
end
Run Code Online (Sandbox Code Playgroud)

回报

extendList(10)
# => [10]

extendList(123, [])
# => [123]

extendList('a') 
# => ['a']
Run Code Online (Sandbox Code Playgroud)

Ruby 就是这种情况,因为 Ruby 方法是闭包,也就是说,每个方法调用都带有它自己的本地环境。

  • 。。直到所有 3 个“extendList”都被评估后,“print”才会发生。 (2认同)