语法错误:默认参数后面跟随非默认参数。

91
from os import system
def a(len1,hgt=len1,til,col=0):
    system('mode con cols='+len1,'lines='+hgt)
    system('title',til)
    system('color',col)

a(64,25,"hi","0b")
input()
当我运行这段代码时,它会拒绝“def a(...”并用红色突出显示“(”。我不知道为什么。

1
请阅读此链接:http://legacy.python.org/dev/peps/pep-3102/ - James Sapam
2
可能是为什么非默认参数不能跟随默认参数?的重复问题。 - Chris Maes
什么是错误信息? - Mad Physicist
4个回答

158

让我在这里澄清两点:

  • 首先非默认参数不应该跟在默认参数后面,这意味着你不能在函数中定义(a='b', c)。 函数中定义参数的正确顺序是:
    • 位置参数或非默认参数,即(a, b, c)
    • 关键字参数或默认参数,即(a='b', r='j')
    • 仅限关键字参数,即(*args)
    • 变长关键字参数,即(**kwargs)
def example(a, b, c=None, r="w", d=[], *ae,  **ab):

(a,b) 是位置参数

(c=none) 是可选参数

(r="w") 是关键字参数

(d=[]) 是列表参数

(*ae) 是仅限关键字参数

(*ab) 是可变关键字参数

所以首先重新排列你的参数

  • 现在第二件事是当你执行时必须定义len1。 当默认值保存时Python会计算并保存默认值,而在定义函数时len1并不存在(只有在执行函数时才存在)

因此,第二步需要删除这个代码"len1 = hgt",因为它在Python中是不允许的。

记住参数和参数之间的区别。


12
不要在函数参数中使用空列表作为默认值,因为它会跨多次运行而被传递。请改用None。 - Josepas

18

错误信息提示,非默认参数til不应在默认参数hgt之后。

更改参数顺序(函数调用也需要相应调整)或将hgt设置为非默认参数即可解决问题。

def a(len1, hgt=len1, til, col=0):

->

def a(len1, hgt, til, col=0):

更新

SyntaxError掩盖了另一个问题。

os.system仅接受一个字符串参数。

def a(len1, hgt, til, col=0):
    system('mode con cols=%s lines=%s' % (len1, hgt))
    system('title %s' % til)
    system('color %s' % col)

谢谢。还有一件事,你能给我一个链接到任何不过时的Python教程系列的YouTube视频吗?拜托了? - YoungCoder5
@AidanCodeX,我不知道有关于YouTube的Python教程。那么,你觉得从python.org上的Python教程怎么样? - falsetru

15

在关键字参数后面不能有非关键字参数。

请确保重新排列您的函数参数,以此方式:

def a(len1,til,hgt=len1,col=0):
    system('mode con cols='+len1,'lines='+hgt)
    system('title',til)
    system('color',col)

a(64,"hi",25,"0b")

1
最好的简单且有用的答案。我认为Python应该修复这个问题。 - Sos.

0

在函数内部,所有的变量都应该以相同的格式进行定义。虽然你给一些变量设置了默认值。

def(len1, hgt=len1, til, col=0):

应该是这样的

def(len1, hgt, til, col):

或者

def(len1=value, hgt=value, til=value, col=value):

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接