代码:
def evaluate_fruit(fruits):
for fruit in fruits:
if fruit == "Apple":
print("Good choice!")
else:
print("Meh its okay")
list_o_fruits = ["Apple", "Banana", "Orange"]
eval_list = (lambda x=list_o_fruits: evaluate_fruit(x))
eval_list()
输出:
Good choice!
Meh its okay
Meh its okay
谢谢您抽出宝贵的时间阅读本文。
运行上面的代码时,输出是预期的,但是当我将列表/字典(可变)传递给lambda函数时,PyCharm不喜欢它。据我了解,将列表/字典声明为函数的默认值是一种不好的做法,这很有意义。但是,如果我只读取列表/字典的内容而不在函数内部进行任何更改,那该怎么办呢?
两种方法中,用列表/字典参数声明我的lambda函数的更好方法是什么?网络建议了一种变通方法,即通过将默认值设置为“ None”,然后使用if语句,将可变变量作为默认值传递给“正常”功能:
def evaluate_fruits(fruits=None):
if fruits is None:
fruits = []
.
.
.
我也可以将这个概念用于lambda函数,但是那样会使函数不方便冗长和冗余,因为我必须为根据validate_fruits()为每个生成的lambda创建一个if语句条件(有点不利于使用lambda的目的)。一个示例是,如果我有五个列表(list_o_fruits1,list_o_fruits2,... list_o_fruits5),并且我想通过valuate_fruits()为每个列表创建一个lambda函数(eval_list1,eval_list2,... eval_list3)。我可能会缺少某些东西吗?
[如果您唯一的要求是将多个元素捆绑在一起成为一个对象,并且该对象不需要是可变的,请使用元组而不是列表。元组提供了所有与列表相同的行为,只是修改了它们的元素。确切地说,可变元素仍然可以突变,但是不能分配,添加或删除元组的元素,并且元组本身被认为是不可变的数据结构。构造元组的语法与列表相同,只是带有括号而不是方括号:
# Immutable container with immutable elements, perfectly fine to use as a default argument
tuple_o_fruits = ("Apple", "Banana", "Orange")
Python缺乏通用的可强制执行的const-correctness是真正让我感到不快的语言之一。标准解决方案是使用内置的不可变数据类型(例如tuple
)代替可变数据类型(例如list
)。例如,set
的不变形式是frozenset
。许多常见的内置类型,例如str
,int
和float
仅以不可变形式提供。 bytes
是一个有趣的情况,因为不可变形式比其可变的替代项bytearray
更好。缺少不变选择的最著名的内置可变类型是dict
(but it's not hard to make your own)。
因此,“如何避免发出关于可变默认参数的警告”的真正答案是不使用可变对象,这是十分之九(不使用可变对象),因为通常都可以使用不可变的替代方法。这足以满足您的情况。