Python中的默认参数实例分析
作者:spirit_djy 发布时间:2023-02-20 20:19:38
标签:python,默认参数
本文研究的主要是Python中的默认参数的相关内容,具体如下。
熟悉C++语言的可以知道,C++语言中的默认参数是写在函数声明中的,为语法糖,与函数的调用无关,是在函数调用的时候由编译器补齐参数然后进行调用。
而Python中的默认参数与其有相当大的不一样,如下例中的代码执行结果会是什么呢?
def test_parameter(a, dfp=[]):
dfp.append(a)
print(dfp)
test_parameter(1)
test_parameter(2)
test_parameter(3)
从结果中可以看到其结果如下,与我们期望完全不一致:
[1]
[1, 2]
[1, 2, 3]
分析
为什么Python的默认参数是这样的表现,需要从Python的函数定义说起。Python中 def 实际上是可执行语句,执行 def 的时候会创建一个函数对象,而默认参数也会在执行 def 语句的时候计算出来并存在函数的_defaults_属性中。
def test_parameter(a, dfp=[]):
dfp.append(a)
print(id(dfp))
test_parameter(1)
test_parameter(2)
print(test_parameter.__defaults__)
print(id(test_parameter.__defaults__[0]))
结果如下,可见调用函数时使用的默认参数和_defaults_中的对象为同一对象:
140109485401224
140109485401224
([1, 2],)
140109485401224
使用
在明白上述原理后,可以知道以后在使用默认参数的时候需要注意,如果默认参数是可变对象则需要判断是否每次调用函数时是共享默认参数还是产生新对象。如果是新生成对象,常采用None作为默认参数占位,如果判断当前为None,则新建可变对象使用。
def test(a, dfp=None):
if dfp is None:
dfp = []
pass #使用dfp
来源:http://blog.csdn.net/spirit_djy/article/details/50663563


猜你喜欢
- 外部直接执行python文件时,我们有时需要获得命令行的参数获得命令行参数的两种方式1、通过sys.argvsys.argv:获得一个参数列
- import osdef load() : filename = os.getcwd() + r'
- 一、概述:Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通
- declare @i int set @i='a' &
- EXCEL的数值排序功能还是挺强大的,升序、降序,尤其自定义排序,能够对多个字段进行排序工作。那么,在Python * 中,有没有这样强大的排
- 前言: 首先刚开始知道要书写一个这样的功能我的内心是比较崩溃的 完全没有思路, 然后就打开官网的文档进行观
- 之前一直没弄清jsonArray和jsonObject的区别,今天终于弄明白了。jsonArray是数组,以[ ]包含数据,jsonObje
- PyCharm PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法
- 现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2),所以我用Pyth
- Tensorflow 提供了一种统一的格式来存储数据,这个格式就是TFRecord,上一篇文章中所提到的方法当数据的来源更复杂,每个样例中的
- 根据 homebrew-brew 官方的解释得知,MongoDB 不再是开源的了,并且已经从 Homebrew中移除 #43770正是由于
- 一、查看event是否开启show variables like '%sche%'; set global ev
- 前言首先需要知道的是,js中有6个值为false,分别是: 0, '', null, undefined, NaN 和 fa
- Python中,队列是线程间最常用的交换数据的形式。Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。创
- 今早开机发现,打开SQL Server 2008 的 SQL Server Management Studio,输入sa的密码发现,无法登陆
- 1.timeit模块timeit模块可以用来测试一小段python代码的执行速度class timeit.Timer(stmt = '
- 本文为大家分享了微信小程序实现留言板的具体实现方法,供大家参考,具体内容如下先说一下小程序的开发环境之类的基础东西1.到微信公众平台下载开发
- 一、基本使用①从属于time这个包②一般使用都是使用time.Time 这个类型表示时间 ,time包中还有一些常量,源码如下// Comm
- 一、概述变量的功能是存储用户的数据二、声明变量Go语言的每一个变量都拥有自己的类型,必须经过声明才能开始用变量的声明格式:var <变
- 本文实例讲述了Python数据结构之图的应用。分享给大家供大家参考,具体如下:一、图的结构二、代码# -*- coding:utf-8 -*