sma*_*c89 1 python default-value
在我的节目中遇到了这种奇怪.这是一个麻烦的部分片段:
#!/usr/bin python
def test_func( newList, myList=[] ):
for t in newList:
for f in t:
myList.append(f)
return myList
print test_func([[3, 4, 5], [6, 7, 8]])
print test_func([[9, 10, 11], [12, 13, 14]])
Run Code Online (Sandbox Code Playgroud)
第一次调用函数时,它会生成
[3, 4, 5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)
第二次
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会这样.python函数是静态的,因为它们保留了后续调用中传递给它们的值,或者我在代码中遗漏了什么?
不要将mutable用作关键字参数.
def test_func( newList, myList=None ):
myList = [] if myList is None else myList
Run Code Online (Sandbox Code Playgroud)
虽然答案已被接受,但了解为什么会发生这种情况很有趣也很重要,以避免不太明显的陷阱。
执行函数定义时会评估默认参数值。这意味着表达式会在定义函数时计算一次,并且每次调用都使用相同的“预计算”值。这对于理解何时默认参数是可变对象(例如列表或字典)尤其重要:如果函数修改了对象(例如,通过将项目附加到列表),则实际上修改了默认值。这通常不是预期的。解决这个问题的一种方法是使用 None 作为默认值,并在函数体中明确测试它
有关 Python 语言中可变参数的相关讨论,请参阅此处的StackOverflow 讨论。讨论指向了一篇关于Effbot - Python 默认值的非常有趣且内容丰富的文章它很好地解释了为什么会观察到这种行为以及这种行为是可取的地方 - 例如,执行非常计算密集型计算的计算器函数可能使用可变字典作为默认参数来存储由用于计算的参数键控的计算结果。在这种情况下,当客户端请求执行计算时,该函数可以查找可变字典并返回值(如果已经存在),否则执行计算。
希望这个答案提供了对 python 这种“惊人”行为的深入了解,并有助于设计正常工作且高性能的函数。
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |