比较来自世界各地的卖家的域名和 IT 服务价格

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

有时,具有默认参数似乎自然,这是一个空列表。 然而
https://coderoad.ru/1132941/
.

例如,如果我有一个功能:


def my_func/working_list = []/:
working_list.append/"a"/
print/working_list/


第一次打电话时,它将默认工作,但呼叫将更新现有列表 /一般 "a" 对于每一个挑战/ 并打印更新的版本。

所以,有什么是获得所需行为的Pythonic方法 /每个呼叫的新鲜清单/?
已邀请:

莫问

赞同来自:

def my_func/working_list=None/:
if working_list is None:
working_list = []

working_list.append/"a"/
print/working_list/


https://docs.python.org/refere ... tions
说你必须使用
None

默认和明确
https://coderoad.ru/3257919/
在身体功能。

涵秋

赞同来自:

现有答案已经提供了关于他们要求的直接决定。 但是,由于这是新程序员的一个非常常见的陷阱。 Python, 值得添加解释原因 python 表现得很好的方式 "

引导公路锅 Python

" 作为 "

可变的默认参数

":
http://docs.python-guide.org/e ... chas/
/

引用: "

默认参数 Python 在定义函数时计算一次,而不是每次调用函数时 /它是如何发生的,说, Ruby/. 这意味着如果使用默认的可变参数和突变,则您还可以为所有未来的函数调用进行此对象。

"

其实现的示例代码:


def foo/element, to=None/:
if to is None:
to = []
to.append/element/
return to

风见雨下

赞同来自:

并不认为这是在这种情况下的值,但您可以使用对象标识符来检查缺席:


if working_list is None: working_list = []


您也可以利用布尔运算符 or 由B确定​​。 python:


working_list = working_list or []


虽然如果来电者会给你一个空名单,它会出乎意料地表现 /这被认为是假的/ 作为 working_list 并期望您的功能将改变他给她的清单。

三叔

赞同来自:

如果函数的目的是

改变

传输的参数如图所示
working_list

, 看答案 HenryR /=None, 检查可用性 None 里面/.

但是如果你没有打算变异参数,只需将它用作列表的起点,即可简单地复制它:


def myFunc/starting_list = []/:
starting_list = list/starting_list/
starting_list.append/"a"/
print starting_list


/或者在这个简单的案件中
print starting_list + ["a"]

, 但我认为这只是一个玩具的例子/

一般来说,你的论点的突变是一种糟糕的风格 Python. 预期完全更改对象的单一功能 - 这些是对象的方法。 更频繁地突变可选的论点 — 只是在一些挑战中发生的副作用是最好的界面?

如果你习惯了 C "显示参数", 这绝对不需要 - 您可以始终以元组的形式返回多个值。

如果您这样做,可以在不创建中间列表的情况下有效构建长期的结果列表,请考虑将其写为发电机并使用
result_list.extend/myFunc///

打电话。 因此,您的挑战同意仍然非常干净。

一张突变可选参数的图片

经常是隐藏的 "memo" ARG 在递归函数中:


def depth_first_walk_graph/graph, node, _visited=None/:
if _visited is None:
_visited = set// # create memo once in top-level call

if node in _visited:
return
_visited.add/node/
for neighbour in graph[node]:
depth_first_walk_graph/graph, neighbour, _visited/

冰洋

赞同来自:

也许我不是在这个主题中,但请记住,如果你只想传递变量的参数,那么python的方式是传输管家
*args

或字典
**kargs

. 它们是可选的,而且比语法更好
myFunc/[1, 2, 3]/

.

如果你想经过Motorcade:


def myFunc/arg1, *args/:
print args
w = []
w += args
print w
>>>myFunc/1, 2, 3, 4, 5, 6, 7/
/2, 3, 4, 5, 6, 7/
[2, 3, 4, 5, 6, 7]


如果要传输字典:


def myFunc/arg1, **kargs/:
print kargs
>>>myFunc/1, option1=2, option2=3/
{'option2' : 2, 'option1' : 3}

冰洋

赞同来自:

已经有了好的和正确的答案。 我只是想给出另一个语法来写作您想要做的事情,例如,当您希望创建带有空默认列表的类时,我发现更美丽:


class Node/object/:
def __init__/self, _id, val, parents=None, children=None/:
self.id = _id
self.val = val
self.parents = parents if parents is not None else []
self.children = children if children is not None else []


此片段使用操作员语法 if else. 我特别喜欢这个,因为它是一个整洁的小单行没有结肠等,而且它几乎被读为正常的英语建议。 :/

在你的情况下,你可以写


def myFunc/working_list=None/:
working_list = [] if working_list is None else working_list
working_list.append/"a"/
print working_list

涵秋

赞同来自:

我拿了 UCSC 扩展课程
Python for programmer


什么是真实的: def Fn/data = []/:

但/ 这是一个好主意,以便您的数据列表每次呼叫开始空。

B./ 这是一个好主意,所以所有调用在调用时不提供任何参数的调用功能将收到空列表作为数据。

c/ - 如果您的数据是行列表,这是一个合理的想法。

d/ 这是一个坏主意,因为默认情况下 [] 将累积数据,默认情况下 [] 将随着后续挑战而改变。

回答:

d/ 这是一个坏主意,因为默认情况下 [] 将累积数据,默认情况下 [] 将随着后续挑战而改变。

要回复问题请先登录注册