美文网首页
用None来描述具有动态默认值的参数

用None来描述具有动态默认值的参数

作者: 叶田的学习笔记 | 来源:发表于2018-11-04 23:14 被阅读0次

下面的代码用来描述两个不同学生选择不同课程的场景。

class Student(object):
    def __init__(self,name,course=[]):
        self.name = name
        self.course = course
    def addcourse(self,coursename):
        self.course.append(coursename)
    def printcourse(self):
        for item in self.course:
            print(item)

stuA = Student('wang')
stuA.addcourse('english')
stuA.addcourse('math')
print(stuA.name + "'s courses:")
stuA.printcourse()
print('----------------')
stuB = Student('li')
stuB.addcourse('chinese')
stuB.addcourse('music')
print(stuB.name + "'s courses:")
stuB.printcourse()

结果:
wang's courses:
english
math
----------------
li's courses:
english
math
chinese
music

问题:li同学多了两门课。
原因:在实例化两个对象的时候,这两个对象被分配了不同的内存空间,并且调用__init__()函数进行初始化。但由于__init__()函数的第二个参数是个默认参数,默认参数在函数被调用的时候胡仅仅评估一次,以后都会使用第一次评估的结果。因此,实际上对象空间里面的course所指向的是list的地址,每次操作的实际上是list所指向的具体列表。

要解决上述例子中的问题,最好是传入None作为默认参数,在创建对象的时候动态生成列表。

def __init(self,name,course=None):
    self.name = name
    if course is None:
        course=[]
    self.course = course

再举一个例子:
在打印日志消息的时候,把相关事件的记录时间也标注在消息里。

from datetime import datetime
import time

def log(message,when=datetime.now()):
    print('{}:{}'.format(when,message))

log('Hi,there!')
time.sleep(0.1)
log('Hi,again!')

结果 :
2018-11-04 23:05:40.244085:Hi,there!
2018-11-04 23:05:40.244085:Hi,again!

两条消息的时间戳是一样的。
将参数值设置为None,就没问题了。

def log(message,when=None):
    when = datetime.now() if when is None else when
    print('{}:{}'.format(when,message))

相关文章

  • 用None来描述具有动态默认值的参数

    下面的代码用来描述两个不同学生选择不同课程的场景。 问题:li同学多了两门课。原因:在实例化两个对象的时候,这两个...

  • python基础-函数

    定义函数格式:def 函数名称(参数 = None):代码组其中 参数 = None ,设置默认值可为空

  • Swift5.0 监听键盘写法

    其他: 忽略具有默认值的参数的外部参数名 当函数(或者方法)的参数具有默认值时,Swift自动为该参数提供与参数名...

  • 方法

    def定义一个方法 当没有return时,方法默认返回None 方法参数默认值从右到左,强烈推荐方法默认值为静态值...

  • 「python」 三个方面讲解函数的缺省参数

    所谓缺省参数,在定义函数时,可以给某个参数指定一个默认值,具有默认值的参数就叫做缺省参数。调用函数时,如果没有传入...

  • 5-2 深入函数-定义与调用

    1.默认值参数 在Python中,可以在声明函数的时候,预先为参数设置一个默认值,当调用函数,如果某个参数具有默认...

  • wxpython学习备忘之布局

    一、Frame 框架或者叫窗口1、init方法参数:parent:上级窗口,如果是顶层窗口则为None,没有默认值...

  • GC - 垃圾收集器参数

    参数描述UseSerialGCClient 模式下的默认值,打开后,使用 Serial + Serial Old ...

  • SweetAlert自定义可用参数

    可用参数 参数默认值描述 titlenull(required)窗口的名称。可以通过对象的"title"属性或第一...

  • Python开发人员犯下的10个最常见的错误

    1 滥用表达式作为函数参数的默认值 python允许通过为函数提供默认值来指定函数参数的,但是当默认值是可变的时,...

网友评论

      本文标题:用None来描述具有动态默认值的参数

      本文链接:https://www.haomeiwen.com/subject/uoodxqtx.html