微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我应该将函数列表参数设置为空或无,而不是使用普通变量

如何解决为什么我应该将函数列表参数设置为空或无,而不是使用普通变量

我一直在寻找有关为什么人们不应该使用空列表作为函数参数并且不传递任何类型作为参数并提出一些问题的信息。 这是我的代码

def add_employee(emp,emp_list=None):
    if emp_list is None:
        emp_list = []
    emp_list.append(emp)
    print(emp_list)

这是未指定第二个参数类型的代码

def add_employee(emp,emp_list):
    emp_list.append(emp)
    return emp_list
  1. 当我没有将emp_list定义为空列表时,或者我没有将emp_list定义为空列表时,我无法利用函数认参数行为:我不能像add_employee('Mark')那样调用它,我不得不添加第二个变量来传递。为什么具有备份认行为会很好呢?为什么我不能只将其保留为emp_list。

解决方法

这里很好地解释了为什么应避免在默认值中使用可变参数。或者至少要谨慎使用它们:link

定义功能时将首次创建列表(在内存中的某个位置)的一般要点。因此,当python读取并解释代码时,您将在函数的第一个“读取”位置创建一次该列表。

这意味着您每次调用该函数时都不会创建新列表,只有在定义它时。

为说明起见,我将使用上面共享的链接中的示例:

def some_func(default_arg=[]):
    default_arg.append("some_string")
    return default_arg
>>> some_func()
['some_string']
>>> some_func()
['some_string','some_string']
>>> some_func([])
['some_string']
>>> some_func()
['some_string','some_string','some_string']
  1. 如果我正确理解了您的问题,那么您是在问为什么最好还是显式定义emp_list而不是将其置于函数之外。在我看来,它归结为封装。本质上,您是在尝试确保函数不会更改其scope之外的任何事物的行为,因此您被迫直接将其传递给事物并且必须明确。实际上,如果您有一个变量不在emp_list范围内,那么只要您了解预期的行为,就可以将其追加到绝对好。

  2. 如果在代码的第一位以emp_list的形式传递列表,则变量emp_list将包含列表a。 if语句将检查列表a is None是否有效,由于该检查失败,它将跳过为其分配新的空列表的下一行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。