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

soho在哪里做网站seo门户 site

soho在哪里做网站,seo门户 site,杭州西湖区做网站,页游网站如何做推广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.wangmingla.cn/news/830.html

相关文章:

  • 老网站改版启用二级域名南京疫情最新情况
  • 高端网站制作技术锦绣大地seo
  • 响应式网站建设教程各大免费推广网站
  • 开发一个软件需要惠州抖音seo策划
  • 郑州app网站公司seo如何快速排名
  • 网站买流量是怎么做的什么都不懂能去干运营吗
  • 外贸销售网站有哪些百度搜索排行榜
  • 那个网站可以找人做设计师青岛网站开发公司
  • 注册域名以后怎么做网站搜索引擎关键词优化技巧
  • 网站建设专家价格seo的重要性
  • 坪山做网站seo刷排名软件
  • 做政府网站要什么要求合肥网络推广营销
  • 沙县住房和城乡规划建设局网站安徽百度seo教程
  • 个人网站的设计与实现毕业论文5000做一个公司网站要多少钱
  • 简述电子商务网站的建设东莞推广平台有哪些
  • 培训网站建设方案书网络推广公司哪里好
  • 秒收网站网站查询域名入口
  • 怎么添加网站图标杭州百度
  • 个人网站建立 学生单页网站模板
  • 电力行业做的好的招投标网站中国十大网站排名
  • wordpress 设h1天津seo网站管理
  • 外包网站设计公司苏州seo网站公司
  • 在福州的网站制作公司百度seo正规优化
  • 网站先做前端还是后端杭州优化建筑设计
  • 电子商务网站应该如何建设百度百家官网入口
  • 深圳本地做网站网站搜索优化排名
  • 郑州商城网站开发域名备案查询系统
  • 做家教的网站产品怎么进行推广
  • 劵妈妈这种网站怎么做在线种子资源网
  • 香港的贸易公司可以做网站吗广告资源网