函数中的元组比较

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'。检查valuestest 中的内容。 因为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 传递指向类型的指针。解析器认为您传递的关键字参数

【讨论】:

以上是关于函数中的元组比较的主要内容,如果未能解决你的问题,请参考以下文章

比较 2 个相同大小的元组列表:比较和交换

Python:元组列表:比较所有元组并检索元组的元素不等于任何其他元组的元组

Python 函数正在创建一个额外的元组

C#中的元组(Tuple)和结构体(struct)

从Haskell中的元组中提取第n个元素(其中n和元组被赋予参数)

对有符号整数内的元组进行排序