繁体   English   中英

function 中的元组比较

[英]Tuple comparison in function

我想知道为什么我的比较返回False而不是True尽管'a' == 'a'

def test(*values):
    return values[0]=='a'

tuple = ('a',)
test(tuple)

Output: False

在 function 声明中使用 *args 语法意味着所有参数都将被收集到一个新的元组中。 当你现在将你的元组传递给这个 function 时,它将创建一个只有一个元素的元组,因为你只传递了一个参数。 values 的values(('a',),)一个包含元组的元组。 您可能打算做的是将元组传播到 function 调用中,该调用涉及相同的星号语法: test(*tuple)会产生values == ('a',)正如您所期望的那样。

这是因为您在 function 定义中使用*values而不是 values

当您在 function 中使用特殊语法*args时, args将作为元组返回,其中每个 arg 都是元组的一个元素。

所以例如

> def print_args(*args):
    print(args)
> print_args('a', 'b', 'c')

# Outputs:
('a', 'b', 'c')

在您的情况下,因为您已经传入了一个元组,所以函数中的values就像“好的,我很乐意将一个元组作为我的第一个参数”,并且values变成一个元组的元组(以及一个单一的元组元组)。 因此,您将 ('a',) 与 'a' 进行比较并且您的检查失败

TL;DR:要么只传入'a' ,要么将*values更改为values

def test(values):
    return values[0] == 'a'

tuple = ('a',)
test(tuple)

# Outputs:
True

像这样修改您的 function :

def f(*v):
    print(v)
    return v[0] == 'a'

然后调用 f(('a',)),你会得到 (('a',),) False function 得到一个元组 ('a',) 而不是 'a'

引用

def func(*args, **kwargs): ... var-keyword: 指定可以提供任意多个关键字 arguments(除了已经被其他参数接受的任何关键字 arguments 之外)。 可以通过在参数名称前加上 ** 来定义这样的参数,例如上面示例中的 kwargs。

https://docs.python.org/3/glossary.html#term-parameter

您没有使用 *args 传递指向类型的指针。 解析器认为您传递的关键字 arguments

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM