我正在尝试构建一些代码,我已经定义了一个函数,以测试一个计数器如何在函数内部工作:
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模块.提及.它非常有用,可以更轻松地调试大型程序.你可以得到时间,消息类型等.