将函数参数转换为列表的问题
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
当然在局部范围内。
我有以下代码:
>>> 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
当然在局部范围内。