Python 非默认参数跟随默认参数
我不断收到有关函数参数的错误消息 我见过其他一些类似的问题,但我很难理解答案,这些人也有不同的情况,更复杂Python 非默认参数跟随默认参数,python,python-3.x,arguments,parameter-passing,Python,Python 3.x,Arguments,Parameter Passing,我不断收到有关函数参数的错误消息 我见过其他一些类似的问题,但我很难理解答案,这些人也有不同的情况,更复杂 def check(user_answer='', list_of_blanks, letters): x = 0 for letter in letters: if letter == user_answer: list_of_blanks[letters.index(user_answer)] = user_answer
def check(user_answer='', list_of_blanks, letters):
x = 0
for letter in letters:
if letter == user_answer:
list_of_blanks[letters.index(user_answer)] = user_answer
x += 1
if x == 0:
return False
else:
str(list_of_blanks)
list_of_blanks = ''.join(list_of_blanks)
return list_of_blanks
pycharm突出显示了“空白、字母列表”(函数参数),并给出了一个错误,该错误表示:
Non-Default parameter follows default parameter.
如果我尝试将参数默认为空列表,如下所示:
list_of_blanks=[], letters=[]
然后我得到这个错误:
Default argument value is mutable.
是否可以切换参数的位置?然后你可以写:
def check(list_of_blanks, letters, user_answer=''):
位置参数之前不能有非位置参数(
param=value
)
def func(位置1,位置2,非位置=10)
这主要是因为不需要指定非位置参数的名称
func(10,50,非位置=60)
=func(10,50,60)
给参数一个默认值使其成为可选的。在非可选参数之前不能有可选参数,因为这样就不清楚要分配和不分配哪些插槽。您可能能够提出一组复杂的规则来确定如何解释参数,但是Python试图避免不必要的复杂性、模糊性和违反直觉的行为
您有许多选项可用于解决此问题:
def check(list_of_blanks, letters, user_answer=''):
def check(user_answer='', list_of_blanks=(), letters=()):
使用不可变的元组可以避免对默认列表进行意外(永久)修改def check(user_answer, list_of_blanks, letters):
坦率地说,这似乎是你最好的选择。从概念上讲,函数最重要的参数首先出现。除非函数有副作用,否则将这些参数设置为可选参数似乎有点缺陷def check(user_answer='', *, list_of_blanks, letters):
您将无法再调用函数作为check('abc',['b','c'],['a'])
,因为list\u of_blanks
和letters
不能再指定为位置参数。您现在必须使用关键字调用,如check('abc',列出空格=['b','c',字母=['a'])
。但是现在第一个参数是明确的可选参数,因此您可以执行诸如检查(字母=['a'],空格列表=['b','c'])之类的操作。我个人的偏好,递减顺序是3,4,1,2。我认为最好的选择是没有可选的参数,但我可以想象你正处于这样一个阶段:不管设计含义如何,你都想使用只包含关键字的参数。可变的事情是警告阅读定义函数参数的不同方式你不需要指定任何参数的名称。准确地说,你根本不需要传递非位置参数,这会把事情搞得一团糟……这是因为它们有默认参数。好吧,我只是说,你所说的主要原因其实不是问题。因为如果指定名称是个问题,那么即使OP中的定义有误,我们也可以调用
check('answer',[1,2],“abc”)
。我的观点是,真正的问题是,它可以被忽略,然后你的立场改变