Python: Python |(基础)函数默认参数必须指向不可变对象

python scott 204℃ 0评论

测试

Python 默认参数提高了变成效率,但是这里面的坑也是坑死人不偿命,使用稍微不正确,会造成致命的失误

1
2
3
4
5
6
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def test(lang=[]):
  lang.append('python')
  return lang

当老实调用时,结果如你所愿


1
2
print(test(['js','go']))
print(test(['c','java']))

结果如下

1
2
3
['js', 'go', 'python']
['c', 'java', 'python']
[Finished in 0.1s]

但是如果多次使用默认参数调用时,奇迹出现了


1
2
print(test())
print(test())

结果如下:


1
2
3
['python']
['python', 'python']
[Finished in 0.1s]

或许有人对此感到很困惑,为什么默认参数会记住更新过的默认参数

分析:

函数在定义的时候,默认参数 lang的值就已经声明了,即空的 [],也就是说 默认参数指向对象 [],在多次调用默认参数的情况下,就改变了 默认参数指向对象的数据, 默认参数指向对象的数据变了,下次再调用时,默认参数已经变了,即不再是你希望的空的 []

为了便于理解等同下面这段:

1
2
3
4
temp = []
def test(lang=temp):
  lang.append('python')
  return lang

这样就好看多了,多次调用时, temp也在不断的变化

注意函数默认参数和函数中的参数的上下文环境

结论

定义函数默认参数时,函数默认参数必须指向不变对象,建议使用 None,str 这些不可变对象处理

重新修改代码

1
2
3
4
5
6
7
8
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def test(lang=None):
  if lang is None:
    lang = []
  lang.append('python')
  return lang

调用


1
2
print(test())
print(test())

结果:


1
2
3
['python']
['python']
[Finished in 0.2s]

原文:http://segmentfault.com/a/1190000002869653

转载请注明:osetc.com » Python: Python |(基础)函数默认参数必须指向不可变对象

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址