首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >避免默认参数为空列表的pythonic方法是什么?

避免默认参数为空列表的pythonic方法是什么?
EN

Stack Overflow用户
提问于 2008-12-14 11:23:55
回答 9查看 79.7K关注 0票数 181

有时,默认参数是空列表似乎是很自然的。还没有

在这些情况下,Python会产生意外的行为

..。

例如,我有一个函数:

代码语言:javascript
复制
def my_func(working_list=[]):
    working_list.append("a")
    print(working_list)

第一次调用默认列表时,它将起作用,但之后的调用将更新现有列表(带有一个

每次调用)并打印更新的版本。

那么,获得我想要的行为的pythonic方法是什么(每次调用都有一个新的列表)?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2008-12-14 11:27:30

代码语言:javascript
复制
def my_func(working_list=None):
    if working_list is None: 
        working_list = []

    # alternative:
    # working_list = [] if working_list is None else working_list

    working_list.append("a")
    print(working_list)

文档

假设你应该使用

作为默认设置,并且显式

测试它

在函数体中。

票数 208
EN

Stack Overflow用户

发布于 2017-05-31 05:15:43

其他答案已经提供了所要求的直接解决方案,但是,由于这是新的Python程序员的一个非常常见的陷阱,因此有必要添加Python为什么会有这种行为的解释,这一点在中进行了很好的总结

Python搭便车指南

可变的默认参数

计算Python的默认参数

一次

在定义函数时,并不是每次都调用该函数(就像在Ruby中一样)。这意味着,如果使用可变的默认参数并对其进行修改,则

意志

并且已经为将来对该函数的所有调用改变了该对象。

票数 48
EN

Stack Overflow用户

发布于 2008-12-14 11:43:58

在这种情况下这并不重要,但您可以使用对象标识来测试是否没有:

代码语言:javascript
复制
if working_list is None: working_list = []

您还可以利用在python中定义布尔运算符或的方式:

代码语言:javascript
复制
working_list = working_list or []

尽管如果调用者给你一个空列表(算作false)作为工作时,这将是出乎意料的行为

_

列表,并希望您的函数修改他给它的列表。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/366422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档