在for循环中使用*args不会考虑更改变量

Jim*_*erg 2 python python-3.x

我有很长的循环用于重复名称,我希望通过使用函数简化事情,而不是每次都重复匹配的所有附带效果.我从以下测试用例开始,但它不像我期望的那样工作:

x, y = 0, 0
def testFunc(*args):
    global x, y
    for arg in args:
        if arg:
            x +=1
        else:
            y +=1
    return (x, y)
Run Code Online (Sandbox Code Playgroud)

当我运行它:

>>>testFunc(x==y,x==y,x==y)
(3,0)
>>>testFunc(x==y)
(3,1)
>>>testFunc(x!=y,x!=y,x!=y)
(3,4)
Run Code Online (Sandbox Code Playgroud)

基本上,在任何操作发生之前,参数似乎都会转换为布尔值.有没有办法避免这种情况?我原以为:

>>>testFunc(x==y,x==y,x==y)
(2,1)
>>>testFunc(x==y)
(2,2)
>>>testFunc(x!=y,x!=y,x!=y)
(4,3)          
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 6

基本上,在任何操作发生之前,参数似乎都会转换为布尔值.

Python首先在调用函数之前评估参数,因此这是预期的行为.两个人int的平等是一个平等的bool.所以它首先评估x == y三次,每次都产生相同的结果.接下来它调用函数testFunc(True, True, True).

有没有办法避免这种情况?

您可以通过以下方式使其成为可调用的,从而推迟评估:

def testFunc(*args):
    global x, y
    for arg in args:
        if arg():  # we call arg
            x +=1
        else:
            y +=1
    return (x, y)
Run Code Online (Sandbox Code Playgroud)

然后用以下方法调用它:

>>> eq = lambda: x == y
>>> neq = lambda: x != y
>>> testFunc(eq, eq, eq)
(2, 1)
>>> testFunc(eq)
(2, 2)
>>> testFunc(neq, neq, neq)
(3, 4)
Run Code Online (Sandbox Code Playgroud)

因此我们在这里传递结果x == y,我们传递一个函数,当被调用时,计算结果x == y.因此,该值是计算xy此刻的调用时.