for element in container:
# some code here
temp_variable = f1(element)
# more code
# much later in the code
for element in container:
# some code
another_variable = g(temp_variable)
# more code
temp_variable = f2(element)
# more code
在第二个for
循环中,我在分配之前意外使用了变量temp_variable
。通常情况下,我会得到NameError
异常,但不幸的是,它在前一个循环中幸存,有效并初始化。
是否有任何编码实践,IDE工具等可以帮助防止此类错误?
顺便说一下,我觉得如果循环中的变量没有在循环结束后存活可能会更好。
修改
@Ignacio Vazquez-Abrams:
如果我理解正确,建议不要在多个循环中使用相同的变量名作为局部变量。我有两个问题:
在多个循环中,使用的最具描述性的变量名称通常是相同的。说,我使用了unique_visitor_count
之类的东西。我不想禁止这个变量在代码中进一步使用,在另一个循环中。
在处理现有代码时,检查我之前是否已经使用过任何新的变量名称是非常繁重的。
答案 0 :(得分:7)
如果在代码中“更晚”,那么您应该将代码分解为多个函数。听起来这个功能太长了。
另一个提示是使用有意义的名称。 temp_variable
,tmp
,temp
等不是好名字。使用描述其指向的值的名称。这将消除此类问题的大量潜在事件。
此外,列表推导不会泄漏他们的变量,所以如果你可以使用它们,那么这只是他们通常更好的另一个原因。但它们并不适用于所有情况。
答案 1 :(得分:4)
如果希望变量在循环结束后消失,请将循环重构为函数。这样,在调用函数之后,变量将超出范围并将被垃圾收集。
至于可以防止此类错误的编码实践,我建议您。)将这些类型的函数放在函数中需要临时变量,并且b。)单元测试(因为第二个for循环不会执行本身,只是for循环的单元测试会抓住你的错误。)
答案 2 :(得分:3)
尝试在不再需要时添加del temp_variable
。
答案 3 :(得分:3)
如果您不希望它泄漏局部变量,其他人建议将代码放入函数中。我想建议您将这些函数放在函数中。通过这种方式,他们可以访问外部函数中定义的变量,因此您不必将它们传入。只需在需要时定义内部函数并立即调用它们,除非它们可以重复使用。
def myfunc(a):
i = 10
def infunc():
for i in range(a):
print i,
infunc()
print i
myfunc(5)
>>> 0 1 2 3 4 10
这不是特别漂亮,但确实有效,你不应该经常使用它。
答案 4 :(得分:0)
尝试运行pylint。它不会直接捕获这样的错误,但会告诉您何时不使用变量的值。
答案 5 :(得分:0)
是否有任何编码实践,IDE工具等可以帮助防止此类错误?
首先设计。代码第二。