返回Python函数之外的计数器

我正在尝试构建一些代码,我已经定义了一个函数,以测试一个计数器如何在函数内部工作:

def errorPrinting(x):
    x += 1
    return x

然后我在一些条件逻辑中使用该函数,我希望计数器在满足条件时增加.

x = 1

for row in arcpy.SearchCursor(fc):              

    if not row.INCLUSION_TYPE or len(row.TYPE.strip()) == 0:
        errorPrinting(x)
        print x

    elif len(row.TYPE) not in range(2,5):
        errorPrinting(x)
        print x

    elif row.INCLUSION_TYPE.upper() not in [y.upper() for y in TableList]:
        errorPrinting(x)
        print x

我仍然使用函数相当新,所以也许我不理解如何将值返回到函数之外,以便在for循环的下一次迭代中使用.它一直在我身上回归.任何人都可以告诉我如何在函数增加1 x = 1之后将x返回到函数外部吗?

谢谢,
麦克风

最佳答案 你没有递增你的全局x,你正在递增当地参数,也恰好被命名为x! (你的errorPrinting参数可能已被命名为.我称之为xLocal.)

正如您在此处所看到的,x不会被函数递增.

>>> def inc(xLocal):
...     xLocal += 1
...     return xLocal
... 
>>> x = 4
>>> inc(x)
5
>>> x
4

您需要每次将x的值重新分配给函数的返回值.像这样

x = 1
for row in arcpy.SearchCursor(fc):              

    if not row.INCLUSION_TYPE or len(row.TYPE.strip()) == 0:
        x = errorPrinting(x) # <=== here
        print x

    elif len(row.TYPE) not in range(2,5):
        x = errorPrinting(x) # <=== here
        print x

    elif row.INCLUSION_TYPE.upper() not in [y.upper() for y in TableList]:
        x = errorPrinting(x) # <=== here
        print x

在Python中,积分参数和其他基元通常不通过引用传递. (列表,dicts等等.无意中修改列表实际上是Python中常见的错误.)

编辑:传递“引用”和“值”在Python中谈论并不是真的正确.有关详细信息,请参阅this好问题.

所以,使用我之前的例子:

>>> x = 4
>>> x = inc(x)
>>> x
5

请注意,如果这是通过引用传递的参数(如列表),则此策略可行.

>>> def incList(xList):
...     for i in range(len(xList)):
...         xList[i] += 1
... 
>>> xList
[1]
>>> incList(xList)
>>> xList
[2]

请注意,正常的Pythonic语法:

for i in xList:
    i += 1

不会增加全球价值.

注意:如果您希望密切关注很多事情,我还建议使用@SB的logging模块.提及.它非常有用,可以更轻松地调试大型程序.你可以得到时间,消息类型等.

点赞