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

python 不应该将列表作为函数的默认参数

示例:

from typing import List

def add_to(num, target: List=[]):
    target.append(num)
    return target

print(add_to(1))
print(add_to(2))

错误想法:

认为会输出两个长度均为1的列表

[1]
[2]

实际验证:

from typing import List

def add_to(num, target: List=[]):
    print(id(target))
    target.append(num)
    return target

print(add_to(1))
print(add_to(2))

实际输出:

4429714432
[1]
4429714432
[1, 2]

原因:

两次target的ID是一样的,这是因为默认参数作为函数的属性,函数定义时就被定义了,而不是在函数调用时才定义,所以在使用默认参数时,实际都是在使用同一个地址的变量。如果默认参数是列表或者字典这种可变对象,就会导致两次函数调用使用的默认参数是同一个对象,第二次调用函数时,第一次调用的结果被保留下来了, 导致修改错误。但如果默认参数是数字,字符串或者元组这种不可变的对象,就不会出现在这样的问题。应该避免使用可变对象作为默认参数

正确用法:

from typing import List

def add_to(num, target=None):
    if not target:
        target = []
    target.append(num)
    return target

print(add_to(1))
print(add_to(2))

None可以是任意类型的空值,所以空值就设None,不要设置“”,[], {}等


http://www.kler.cn/a/457288.html

相关文章:

  • Lua : Coroutine(协程)
  • CA系统的设计(CA证书生成,吊销,数字签名生成)
  • 【模电刷题复习--填空】
  • 计算机毕业设计Python+Spark考研预测系统 考研推荐系统 考研数据分析 考研大数据 大数据毕业设计 大数据毕设
  • 绘制三元图、颜色空间图:R语言代码
  • 泛域名和二级域名的区别
  • 工业大数据分析算法实战-day14
  • 【每日学点鸿蒙知识】节点析构问题、区分手机和pad、 Navigation路由问题、Tabs组件宽度、如何监听Map
  • Sql Sqserver 相关知识总结
  • 【每日学点鸿蒙知识】Web组件加载空白、C++回调ArkTS、底部横幅隐藏显示、构建warn过多、ArkTS与C++实时通信
  • 深入了解SpringIoc(续篇)
  • Docmatix:突破性的文档视觉问答数据集
  • 从头开始学SpringMVC—01MVC介绍和入门案例
  • ​Python数据序列化模块pickle使用
  • 如何快速又安全的实现端口转发【Windows MAC linux通用】
  • yolov8算法及其改进
  • Golang的文件加密工具
  • Word批量更改题注
  • Pytorch | 利用DTA针对CIFAR10上的ResNet分类器进行对抗攻击
  • 问题-01
  • 学习C++:数据类型
  • Jmeter录制https请求
  • 在asp.net webapi项目中 将数据库连接字符串写在配置文件中,及Program配置Serilog存放路径以及设置
  • JavaWeb期末复习
  • Wordly Wise 3000 国际背单词01 介绍 + 测词汇量
  • 【Beats01】企业级日志分析系统ELK之Metricbeat与Heartbeat 监控