函数中的元组比较
Posted
技术标签:
【中文标题】函数中的元组比较【英文标题】:Tuple comparison in function 【发布时间】:2022-01-10 04:33:53 【问题描述】:我想知道为什么我的比较返回False
而不是True
尽管'a' == 'a'
。
def test(*values):
return values[0]=='a'
tuple = ('a',)
test(tuple)
输出:False
【问题讨论】:
将print(values)
放入您的函数中以发现答案。
提示:你不是在评估'a' == 'a'
,你是在评估('a',) == 'a'
。检查values
在test
中的内容。
因为values[0] == ('a',)
,而不是'a'
,你为什么期望不同?你试过print(values)
看看发生了什么吗?
test(*tuple)
会起作用,因为它会解压缩 tuple
中的值。
【参考方案1】:
这是因为您在函数定义中使用*values
而不是values
当您在函数中使用特殊语法 *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
【讨论】:
另一个选项是调用test(*tuple)
,如果您希望tuple
中的项目作为单独的参数传递给test
。【参考方案2】:
在函数声明中使用 *args 语法意味着所有参数都将被收集到一个新的元组中。当您现在将元组传递给此函数时,它将创建一个只有一个元素的元组,因为您只传递了一个参数。 values
的值是 (('a',),)
一个包含元组的元组。您可能打算将元组传播到函数调用中,该函数调用涉及相同的星号语法:test(*tuple)
,如您预期的那样导致values == ('a',)
。
【讨论】:
【参考方案3】:像这样修改你的函数:
def f(*v):
print(v)
return v[0] == 'a'
然后调用 f(('a',)),你会得到 (('一种',),) 错误的 函数得到一个元组 ('a',) 而不是 'a'
【讨论】:
【参考方案4】:报价
def func(*args, **kwargs): ... var-keyword:指定可以提供任意多个关键字参数(除了已经被其他参数接受的任何关键字参数)。这样的参数可以通过在参数名称前加上**来定义,例如上例中的kwargs。
https://docs.python.org/3/glossary.html#term-parameter
您没有使用 *args 传递指向类型的指针。解析器认为您传递的关键字参数
【讨论】:
以上是关于函数中的元组比较的主要内容,如果未能解决你的问题,请参考以下文章
Python:元组列表:比较所有元组并检索元组的元素不等于任何其他元组的元组