当前位置: 首页 > news >正文

深度网创石家庄百度快照优化排名

深度网创,石家庄百度快照优化排名,如何做网站页面免费的,室内设计经典案例Python编程中,我们有时会给函数或方法提供默认参数。然而,这种做法在某些情况下可能会导致意想不到的行为,尤其是当默认参数是可变对象(例如列表、字典或类实例对象)时。本文将通过几个具体的例子来解释这个问题&#…

Python编程中,我们有时会给函数或方法提供默认参数。然而,这种做法在某些情况下可能会导致意想不到的行为,尤其是当默认参数是可变对象(例如列表、字典或类实例对象)时。本文将通过几个具体的例子来解释这个问题,并提供解决方案。

问题示例

示例一:HauntedBus

首先,考虑以下HauntedBus类:

class HauntedBus:"""A bus model haunted by ghost passengers"""def __init__(self, passengers=[]):self.passengers = passengersdef pick(self, name):self.passengers.append(name)def drop(self, name):self.passengers.remove(name)

在这个类中,passengers参数有一个默认值[]。现在,我们创建两个HauntedBus实例,并向第一个实例添加乘客:

bus1 = HauntedBus()
bus1.pick("小明")
bus1.pick("小红")
print(bus1.passengers)  # 输出: ['小明', '小红']bus2 = HauntedBus()
print(bus2.passengers)  # 输出: ['小明', '小红']

你可能会预期bus2的乘客列表应该是空的,但实际输出表明它包含了bus1的乘客。这是为什么呢?

示例二:使用字典作为默认参数

def add_entry(key, value, dictionary={}):dictionary[key] = valuereturn dictionaryd1 = add_entry('name', 'Alice')
print(d1)  # 输出: {'name': 'Alice'}d2 = add_entry('age', 30)
print(d2)  # 输出: {'name': 'Alice', 'age': 30}

在这个例子中,dictionary参数的默认值是一个空字典。第一次调用add_entry函数时,向字典中添加了键值对'name': 'Alice'。第二次调用时,字典中已经有了之前添加的键值对,所以又添加了键值对'age': 30。发现两次调用共享了同一个字典。

示例三:使用自定义类对象作为默认参数

class DefaultObject:def __init__(self):self.data = []print("DefaultObject Init")def add_to_default(obj=DefaultObject()):obj.data.append(1)return obj.dataresult1 = add_to_default()
print(result1)  # 输出: [1]result2 = add_to_default()
print(result2)  # 输出: [1, 1]

在这个例子中,obj参数的默认值是一个DefaultObject实例。第一次调用add_to_default函数时,向data列表中添加了数字1。第二次调用时,data列表中已经有了一个1,所以又添加了一个1。发现两次调用共享了同一个DefaultObject实例。

原因解析

在Python中,默认参数是在函数定义的时候只初始化一次的,而不是每次调用函数时重新初始化。如果默认参数是一个可变类型/对象,那么后续对这个函数的调用将共享同一个默认参数对象。

解决方案

为了解决这个问题,我们可以使用None作为默认参数值,并在函数内部进行检查和初始化。这样每次创建新实例时都会创建一个新的可变对象,从而避免不同实例或调用之间共享同一个默认参数对象。

修复后的HauntedBus

class HauntedBus:"""A bus model haunted by ghost passengers"""def __init__(self, passengers=None):if passengers is None:passengers = []self.passengers = passengersdef pick(self, name):self.passengers.append(name)def drop(self, name):self.passengers.remove(name)

现在,我们再次创建两个HauntedBus实例并测试:

bus1 = HauntedBus()
bus1.pick("小明")
bus1.pick("小红")
print(bus1.passengers)  # 输出: ['小明', '小红']bus2 = HauntedBus()
print(bus2.passengers)  # 输出: []

这样,每个实例都有自己独立的乘客列表,不会相互影响。

修复后的add_entry函数

def add_entry(key, value, dictionary=None):if dictionary is None:dictionary = {}dictionary[key] = valuereturn dictionaryd1 = add_entry('name', 'Alice')
print(d1)  # 输出: {'name': 'Alice'}d2 = add_entry('age', 30)
print(d2)  # 输出: {'age': 30}

通过将默认参数设置为None并在函数内部进行初始化,每次调用add_entry函数时都会创建一个新的字典,从而避免不同调用之间共享同一个字典。

修复后的add_to_default函数

class DefaultObject:def __init__(self):self.data = []print("DefaultObject Init")def add_to_default(obj=None):if obj is None:obj = DefaultObject()obj.data.append(1)return obj.dataresult1 = add_to_default()
print(result1)  # 输出: [1]result2 = add_to_default()
print(result2)  # 输出: [1]

通过将默认参数设置为None并在函数内部进行初始化,每次调用add_to_default函数时都会创建一个新的DefaultObject实例,从而避免不同调用之间共享同一个实例。

结论

在Python中使用默认参数时,尤其是可变对象,必须小心处理。通过使用None作为默认值并在函数内部进行初始化,可以避免默认参数带来的潜在陷阱。希望这些例子能帮助你理解并避免类似的问题。

作者:Black_Boy
链接:https://juejin.cn/post/7376889083211300905

http://www.yayakq.cn/news/618873/

相关文章:

  • 电子商务网站设计流程有啥可以自己做网站的软件
  • 四川省省建设厅网站四川住房和城乡建设厅网站官网
  • 济宁网站建设神华科技个人电台网站模版
  • 襄阳做网站排行榜国外出名设计网站有哪些
  • 有关网站建设的文章句子模拟建设官方网站
  • 怎么修改网站后台权限如何建设一个优秀的电商网站
  • 连锁酒店的网站建设微信如何建立公众号
  • 天津市做网站中国十大门户网站排行
  • 深圳医疗网站建设报价域名是建网站之前申请吗
  • 怎么做二维码进入公司网站如何做网站网页表白
  • 企业还有人做网站么wordpress留言快速审核
  • 东莞网站网站建设番禺商城网站建设
  • 做网站有必要用wordpresswordpress主题授权码
  • 哪些做海报比较好的网站宁波网站建设公司
  • 广东省建设厅的注册中心网站首页网站建设入门教程视频
  • 典型网站开发的一般流程易语言建设网站
  • 网站建设中 html5 模板手机商城积分兑换
  • 南阳手机网站制作专业做网站的页面设计
  • 宝塔 wordpress 多站点鄞州区建网站外包
  • 如何在网站后台做超链接到文档开发公司职责
  • 网站维护报价表如何做网站内容
  • 如何用代码做分数查询的网站宾县建设局网站
  • 在哪里能找到做网站的人外贸公司名称
  • 平台网站建设有哪些方面厦门注册公司流程和费用多少
  • 南京网站建设开发公司采集网站会收录吗
  • 做ppt设计师哪个网站好东莞做网站seo优化
  • 个人做电商网站wordpress适合做博客的主题
  • 网站配色主题电子商务网站网络安全设计方案
  • 高端企业网站建站学习网站建设的是什么专业
  • 做淘宝店和做网站天津建设工程信息往