Python:默认参数是字典或者列表时需要注意的坑
今天写代码Pycharm给了⼀条inspection
Default argument value is mutable
This inspection detects when a mutable value as list or dictionary is detected in a default value for an argument.
Default argument values are evaluated only once at function definition time,which means that modifying the default value of the argument will affect all subsequent
⼤致意思就是如果你的默认参数是列表或者字典,这个默认参数仅在初始化的时候被实现⼀次,⽽且仅此⼀次,如果后⾯的函数调⽤改变了这个默认参数,可能会影响到以后的这个参数。
啥意思呢?
看个例⼦吧
def add_end(arr = []):
arr.append('end')
print(id(arr), arr)
if __name__ == "__main__":
add_end()
mutable是什么意思add_end()
add_end(arr = ['begin'])
2135770030664 ['end']
2135770030664 ['end', 'end']
2135770030728 ['begin', 'end']
上⾯这个代码说的很清楚,arr这个默认参数本来是⼀个空数组,前两次都是默认调⽤实现,因此arr的
地址都是⼀个,直接append('end')就好,但是后⾯的调⽤改变了默认参数,变成了⾃⼰实现的,这样的话默认参数就会改变,因此地址也变了。
如何做到每次调⽤都能不受之前调⽤的影响呢?可以参考下⾯的实现
def add_end(arr = None):
if arr == None:
arr = []
arr.append('end')
print(id(arr), arr)
if __name__ == "__main__":
add_end()
add_end()
add_end(arr = ['begin'])
2056900272712 ['end']
2056900272712 ['end']
2056900272712 ['begin']
上⾯这段代码清楚的说明了,每次调⽤都是独⽴的,不受其他调⽤的影响
⽐较好奇的是,为什么三次的地址都是⼀样的?可能这是Python默认的机制吧,默认参数和实际参数都是⼀样的地址,每次调⽤地址并不变,修改⾥⾯的内容就好,以上是本⼈愚见,如果有⼤神有其他想法可以指出,欢迎多多交流,谢谢~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论