避免默认参数值为可变警告(PyCharm)

问题描述 投票:0回答:1

代码:

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)。我可能会缺少某些东西吗?

python list dictionary lambda mutable
1个回答
0
投票

[如果您唯一的要求是将多个元素捆绑在一起成为一个对象,并且该对象不需要是可变的,请使用元组而不是列表。元组提供了所有与列表相同的行为,只是修改了它们的元素。确切地说,可变元素仍然可以突变,但是不能分配,添加或删除元组的元素,并且元组本身被认为是不可变的数据结构。构造元组的语法与列表相同,只是带有括号而不是方括号:

# 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。许多常见的内置类型,例如strintfloat仅以不可变形式提供。 bytes是一个有趣的情况,因为不可变形式比其可变的替代项bytearray更好。缺少不变选择的最著名的内置可变类型是dictbut it's not hard to make your own)。

因此,“如何避免发出关于可变默认参数的警告”的真正答案是不使用可变对象,这是十分之九(不使用可变对象),因为通常都可以使用不可变的替代方法。这足以满足您的情况。

© www.soinside.com 2019 - 2024. All rights reserved.