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

时间:2018-11-01 12:54:06

标签: 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)

运行时:

>>>testFunc(x==y,x==y,x==y)
(3,0)
>>>testFunc(x==y)
(3,1)
>>>testFunc(x!=y,x!=y,x!=y)
(3,4)

基本上,在执行任何操作之前,参数似乎已转换为布尔值。有办法避免这种情况吗?我本来期望:

>>>testFunc(x==y,x==y,x==y)
(2,1)
>>>testFunc(x==y)
(2,2)
>>>testFunc(x!=y,x!=y,x!=y)
(4,3)          

2 个答案:

答案 0 :(得分: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)

然后调用:

>>> eq = lambda: x == y
>>> neq = lambda: x != y
>>> testFunc(eq, eq, eq)
(2, 1)
>>> testFunc(eq)
(2, 2)
>>> testFunc(neq, neq, neq)
(3, 4)

因此我们在这里传递x == y的结果,而是传递一个函数,该函数在被调用时计算 x == y的结果。结果,在进行呼叫时将为xy计算该值。

答案 1 :(得分:3)

语句x==y测试是否相等,并且只会产生布尔值。要分配变量,只需使用一个=符号。

例如:

1==3产生False,因此x==y将执行相同的操作,除非xy明确相同

testFunc(x=y)应该可以解决您的问题。此外,*args暗示一个参数列表:

def myFunc(*args):
    for arg in args:
         print(arg)

myFunc(*[1,2,3,4,5,6,7])print用作该列表的每个成员。请注意,您将需要*<list>语法,否则myFunc(<list>)将使列表成为第一个也是唯一的参数。 *从列表中解压缩值