首页 > 编程语言 >一段奇怪的Python代码,ChatGPT的解释——Python默认参数的可变对象共享

一段奇怪的Python代码,ChatGPT的解释——Python默认参数的可变对象共享

时间:2024-12-03 16:11:58浏览次数:4  
标签:None Python 默认 列表 print ChatGPT foo

def foo(a, b=[]):
     b.append(a)
     return b
 ​
 print(foo(1))
 print(foo(1))
 print(foo(1))

 

这段代码会产生许多人可能意料之外的结果。以下是代码的行为以及背后的原因:

代码行为

def foo(a, b=[]):  # 默认参数 b 是一个空列表
    b.append(a)    # 将 a 添加到 b
    return b

print(foo(1))  # 第一次调用
print(foo(1))  # 第二次调用
print(foo(1))  # 第三次调用

输出

[1]
[1, 1]
[1, 1, 1]

原因

  1. 默认参数的可变对象共享

    • 在 Python 中,默认参数只在函数定义时被评估一次。如果默认参数是一个可变对象(如列表或字典),它会在所有后续的函数调用中被共享。
    • 因此,每次调用 foo 时,如果未显式传递参数 b,它会继续使用同一个 b(即最初创建的那个空列表)。
  2. b 是同一个对象

    • 每次调用 foo(1) 时,b.append(a) 会将值添加到同一个共享列表中,而不是重新创建一个新的列表。

如何修复

如果希望每次调用 foo 时都使用一个新的空列表,可以将默认参数设置为 None,并在函数内部进行处理:

def foo(a, b=None):
    if b is None:  # 检查 b 是否为 None
        b = []     # 创建一个新的列表
    b.append(a)
    return b

print(foo(1))  # 输出: [1]
print(foo(1))  # 输出: [1]
print(foo(1))  # 输出: [1]

修复后的输出

[1]
[1]
[1]

总结

  • 默认参数的可变对象(如列表或字典)会被所有调用共享,导致意外的累积效果。
  • 解决方法是使用不可变的默认值(如 None),并在函数内部显式创建新的对象。

标签:None,Python,默认,列表,print,ChatGPT,foo
From: https://www.cnblogs.com/blue-box/p/18584308

相关文章

  • python函数参数传递是否比C语言更高效?——ChatGPT的回答
    Python的函数参数传递并不一定比C语言更高效,两者在效率上的差异主要取决于底层实现和具体的使用场景。以下是详细的比较:C语言参数传递效率按值传递(PassbyValue)是C中的默认方式:函数调用时,实参的值被复制到形参。这意味着函数内部的修改不会影响外部变量。C使用编译......
  • pyad(Python Active Directory)入门教程
    今年换了工作,需要比较频繁的操作AD域控,但是之前同事写的PS脚本比较不灵活(主要是我也不太会PS),然后就想能不能使用Python来编写一些自动化程序操作域控,便找到了pyad这个库。pyad是一个第三方Python库,用于管理MicrosoftActiveDirectory,可以将AD对象表示为Python对象(ADUser、ADGrou......
  • Python的变量作用域
    合法gcount=0defglobal_test():print(gcount)global_test()不合法,报错行:tmp=gcount+1gcount=0defglobal_test():tmp=gcount+1gcount=tmpprint(gcount)global_test()不合法gcount=0defglobal_test():gcount+......
  • python_Django---基础
    1.创建app终端:python3.xmanage.pystartapp app(名字)2.路由创建urls.py:导入函数:fromapp(app名)importviews创建路由:path("/index",views.index(函数名))3.HTML页面内容动态显示views.py:defindex(request):......
  • python logger 控制台,滚动文件
    defsetup_logger(logger_name,level=logging.INFO):logging.basicConfig(format='%(asctime)s-%(filename)s[line:%(lineno)d]-%(levelname)s:%(message)s',level=logging.DEBUG,filename='./l......
  • python毕设 基于JavaEE的民宿预订平台程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景随着旅游业的蓬勃发展,民宿作为一种新兴的住宿方式在国内外都受到了广泛关注。关于民宿预订平台的研究,现有研究主要以大型酒店预订平台......
  • 公共政策和法律法规数据抓取:基于Python爬虫技术抓取政府网站上的政策法规与最新更新
    引言在现代社会,公共政策和法律法规是社会运行的基础,政府网站成为了传播政策法规、更新法律信息的重要平台。随着政策变化和法律法规的更新,准确获取这些信息对于政府、企业、学者、甚至普通公民来说,都具有重要意义。为了有效抓取政府网站上的政策法规及其最新更新信息,爬虫技术......
  • 使用Python爬虫抓取跑步和健身平台上的运动数据
    引言随着科技的不断进步,越来越多的人开始关注健康生活,跑步和健身成为许多人日常生活的一部分。为了帮助人们更好地追踪自己的运动数据,许多健身平台如NikeRunClub、Strava、Keep等,提供了用户的跑步、健身记录,包括运动时长、距离、卡路里消耗、步频等详细数据。这些数据对运动......
  • Python | 再次分享10个Excel自动化脚本,一定有你用得上的!
    在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式。通过Python,我们可以实现对Excel文件的各种自动化操作,提高工作效率。本文将再次分享10个实用的Excel自动化脚本,以帮助新手小白更轻松地掌握这些技能。1.Excel单元格批量填充import pandas as pd# 批量......
  • Python 奇怪的设定:为什么没有 main 函数?
    大家好!上次我们简单聊了Python为什么没有main函数,今天我们来更详细地探讨一下,并用代码进行佐证,帮助大家彻底理解Python的代码执行机制!1.Python代码如何执行?Python是一种解释型语言,这意味着代码不需要编译成机器码,而是由Python解释器逐行读取并执行。2. `__na......