Python 使用不存在的可选参数运行函数

Python 使用不存在的可选参数运行函数,python,python-3.x,function,parameter-passing,Python,Python 3.x,Function,Parameter Passing,我创建了一个函数,该函数上有一个可选参数y: def f(x, *y): print(x) if y in locals(): print(y) 将这些x和y参数传递给函数时,它仅输出x,即使y在局部变量中: a = ['String', 'Optional String'] x = a[0] if len(a) == 2: y = a[1] f(x, *y) #Output: String 我还有第二个问题,当只给出x参数而不给出y时,它会输出一个名称错误

我创建了一个函数,该函数上有一个可选参数
y

def f(x, *y):
    print(x)
    if y in locals():
    print(y)
将这些
x
y
参数传递给函数时,它仅输出
x
,即使
y
在局部变量中:

a = ['String', 'Optional String']
x = a[0]
if len(a) == 2:
    y = a[1]

f(x, *y) #Output: String
我还有第二个问题,当只给出
x
参数而不给出
y
时,它会输出一个名称错误:

a = ['String', 'Optional String']
x = a[0]
if len(a) == 2:
    y = a[1]

f(x, *y) #Output: NameError: name 'y' is not defined
我怎样才能让它工作?提前谢谢

编辑:
看来我误解了什么是可选论点。最终改变了整个代码及其修复。不管怎样,这些答案对我很有帮助,谢谢。

本地人的输出是一本字典——如果你要做:

def f(x, *y):
    print(locals())

f('string', 'other string')
输出将是

{'y': ('other string',), 'x': 'string'}
要访问y中的值,您可以这样称呼它:

def f(x, *y):
    print(x)
    if 'y' in locals():
        print(y)
f('string', 'other string')
输出:

string
other string

检查y是否为本地名称的正确方法是
如果在locals()中为“y”:

但是,这总是正确的,因为
y
始终是本地名称,即使只使用一个参数调用
f
。在这种情况下,我们有
y==()
,即
y
是一个空元组

如果您想知道是否有多个参数,只需编写
if y:

def f(x, *y):
    print(x)
    if y:
        print(y)
我不能证实你的第二个问题。虽然它不能实现您可能想要的功能,但没有名称错误。(您可能想删除星号。)


哦,如果你想要可选参数,就使用可选参数。不是可变长度参数。

y
在函数中不是可选的;它将始终被定义,并且将包含零个或多个位置参数<因此,locals()中的code>y完全没有意义。为什么不直接调用
f(*a)
将元素解压为参数?可选参数是一个具有默认值的参数,如
def(x,y=None):
y in locals()
不检查您希望它检查的内容。它查看由
locals()
返回的字典中是否存在
y
的值。它永远不会,因为
y
将是一个元组(可能为空),字典的键都是标识符(字符串)。您的意思可能是如果locals()中的“y”是
,这将始终是真的(因为
y
总是被定义的,即使它的值是一个空元组)。