将函数参数转换为列表的问题

Problem with converting function arguments to list

我有以下代码:

>>> def test(a,b,c,d):
...     print([x in [a,b,c,d] for x in [1,]])
...     print([x in list(locals().values()) for x in [1,]])

>>> test(1, 2, 3, 4)
[True]
[True]

>>> test(2, 2, 3, 4)
[False]
[True]

这个实现可能看起来有点奇怪,但这个例子源于一个更大的项目,其中有很多函数参数。

对于函数的第一次调用,一切都按预期运行,两个语句的结果相同。然而,对于第二次调用,这种行为对我来说似乎很奇怪。谁能解释一下这是怎么回事?

谢谢!

locals()指的是列表推导的局部值。

考虑:

def test(a,b,c,d):
    print([x in [a,b,c,d] for x in [1,]])
    print([(x in list(locals().values()) and not print(locals())) for x in [1,]])

说明

not print(locals())not None,计算结果为 True,因此 and not print(locals()) 不会更改布尔表达式的结果。

输出:

>>> test(2, 2, 3, 4)
[False]
{'.0': <tuple_iterator object at 0x000001A4D070CDC0>, 'x': 1}
[True]

所以你从第二次打印得到 [True] 因为循环变量 x 当然在局部范围内。