首页 > 编程语言 >python新手常见问题一:乱用表达式

python新手常见问题一:乱用表达式

时间:2023-02-06 15:02:50浏览次数:47  
标签:... 常见问题 bar 默认值 python baz 乱用 foo 函数

python新手常见问题一:乱用表达式_默认值

在函数参数中乱用表达式作为默认值

Python允许给一个函数的某个参数设置默认值以使该参数成为一个可选参数。尽管这是这门语言很棒的一个功能,但是这当这个默认值是可变对象(mutable)时,那就有些麻烦了。例如,看下面这个Python函数定义:

>>> def foo(bar=[]):        
# bar是可选参数,如果没有指明的话,默认值是[]
... bar.append("baz")
# 但是这行可是有问题的,走着瞧…
... return bar

人们常犯的一个错误是认为每次调用这个函数时不给这个可选参数赋值的话,它总是会被赋予这个默认表达式的值。例如,在上面的代码中,程序员可能会认为重复调用函数foo() (不传参数bar给这个函数),这个函数会总是返回‘baz’,因为我们假定认为每次调用foo()的时候(不传bar),参数bar会被置为[](即,一个空的列表)。

那么我们来看看这么做的时候究竟会发生什么:

>>> foo()
["baz"]
>>> foo()
["baz", "baz"]
>>> foo()
["baz", "baz", "baz"]

为什么每次调用foo()的时候,这个函数总是在一个已经存在的列表后面添加我们的默认值“baz”,而不是每次都创建一个新的列表?

答案是一个函数参数的默认值,仅仅在该函数定义的时候,被赋值一次。如此,只有当函数foo()第一次被定义的时候,才讲参数bar的默认值初始化到它的默认值(即一个空的列表)。当调用foo()的时候(不给参数bar),会继续使用bar最早初始化时的那个列表。

由此,可以有如下的解决办法:

>>> def foo(bar=None):
... if bar is None:
# 或者用 if not bar:
... bar = []
... bar.append("baz")
... return bar
...
>>> foo()
["baz"]
>>> foo()
["baz"]
>>> foo()
["baz"]

标签:...,常见问题,bar,默认值,python,baz,乱用,foo,函数
From: https://blog.51cto.com/u_14448891/6039155

相关文章

  • Python新手常见问题二:不正确的使用类变量
    不正确的使用类变量看下面一个例子:>>>classA(object):...x=1...>>>classB(A):...pass...>>>classC(A):...pass...>>>printA.x,B.x,C.x111看起......
  • Python新手常见问题三:在异常处理时错误的使用参数
    在异常处理时错误的使用参数假设你有如下的代码:>>>try:...l=["a","b"]...int(l[2])...exceptValueError,IndexError:#想捕捉两个异常...pass...Tr......
  • Python实现的简易FTP
    Python版本实现了比之前的xxftp更多更完善的功能1、继续支持多用户2、继续支持虚拟目录3、增加支持用户根目录以及映射虚拟目录的权限设置4、增加支持限制用户根目录或者虚......
  • Python中and、or用法实例
    Python中and、or是Python中的逻辑运算符,它们的用法如何呢?and:在Python中,and和or执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值;而是,返回它们实际进行比较的值......
  • Python工具箱系列(二十五)
    Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从......
  • Python工具箱系列(二十四)
    不管多少人黑微软,微软出品的大多数产品都能够深入人心,成为精品。在数据库领域,微软为专业人士提供SQLServer(简称mssql)。为日常办公人士提供Access与Excel这两款数据存储与......
  • 全流程搞清楚 Kubernetes API 的使用,可进行业务二次开发对接 k8s 调用,详细图文说明以
    全流程搞清楚KubernetesAPI的使用,可进行业务二次开发对接k8s调用,详细图文说明以及常见问题整理。使用CLI(如curl)或GUI(如postman)HTTP客户端调用KubernetesAPI有很多理由......
  • OpenCV-Python快速入门(十二):轮廓拟合
    OpenCV-Python快速入门(十二):轮廓拟合​​前言​​​​前提条件​​​​实验环境​​​​轮廓拟合​​​​矩形包围框(cv2.boundingRect())​​​​最小包围矩形框(cv2.minAreaRe......
  • Python中monkey.patch_all()解决协程阻塞问题
    Python全栈工程师核心面试300问深入解析(2020版)----全文预览Python全栈工程师核心面试300问深入解析(2020版)----欢迎订阅直接参考以下实例,采用协程访问三个网站......
  • Python中文编码的问题(UTF-8和CP936的区别)
    Python全栈工程师核心面试300问深入解析(2020版)----全文预览Python全栈工程师核心面试300问深入解析(2020版)----欢迎订阅对于python中中文无法显示,可在首行添加......