【问题标题】:Can someone explain this really basic Python code to me? [closed]有人可以向我解释一下这个非常基本的 Python 代码吗? [关闭]
【发布时间】:2015-01-26 21:41:50
【问题描述】:

最近,我参加了一个 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

输出是:

list1 = [10, 'a'] 
list2 = [123] 
list2 = [10, 'a']

我试图了解为什么第一个列表 list1 具有 'a' 值。

编辑

我检查了所有链接,发现它是初学者的 python “陷阱”,但要感谢答案,不能选择两者,所以我选择第一个。

【问题讨论】:

  • This canonical answer 应该有帮助
  • 我会说这是一个骗局,因为这个问题或任何答案都不太可能使未来的用户受益。这是一个已知的 Python “陷阱!”并且未来的读者应该被重定向到现有的解释。
  • @AdamSmith 这是重复的,因为答案基本上是the default argument is mutable。它不必是完全相同的问题。这里没有可以添加的内容是 a/ 不在另一个问题中并且 b/ 可以被其他人重用。

标签: python list python-2.7


【解决方案1】:

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

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

例如 Ruby 中的等效代码:

def extendList(val, list=[])
  list << val
  return list
end

返回

extendList(10)
# => [10]

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

extendList('a') 
# => ['a']

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

【讨论】:

  • 。 . .and print 直到所有 3 个 extendLists 都被评估后才会发生。
【解决方案2】:

实际上,这不是那么基本,它有点像 python 陷阱:Mutable Default Parameter

与每次函数调用后的打印比较:

>>> def extendList(val,list=[]):
...     list.append(val)
...     return list
...
>>> list1 = extendList(10)
>>> print "list1 = %s " %list1
list1 = [10]
>>> list2 = extendList(123,[])
>>> print "list2 = %s " %list2
list2 = [123]
>>> list3 = extendList('a')
>>> print "list2 = %s " %list3
list2 = [10, 'a']

还有:

>>> list1 is list2
False
>>> list1 is list3
True

【讨论】:

  • 看,使用这段代码我没有在第一个列表中得到“a”。哇。 jeje
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多