2010-11-05 192 views
2
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巴斯克斯 - 艾布拉姆斯:

如果我理解正确的话,建议您不要使用相同的变量名在多个循环的局部变量。我有两个问题:

  1. 经常使用的最具描述性的变量名称在多个循环中恰好相同。说,我用了unique_visitor_count之类的东西。我不想禁止这个变量在代码中被进一步使用,在另一个循环中。

  2. 现有的代码时,这将是非常繁重的检查,如果我想使用任何新的变量名已经被使用过。

+4

我认为最大的编码习惯是首先不这样做。 – 2010-11-05 02:06:09

回答

7

如果代码中的'后期'太多,那么你应该把代码分解成多个函数。听起来这个功能太长了。

另一个提示是使用有意义的名称。 temp_variabletmptemp等都不是好名字。使用描述它指向的值的名称。这将消除这类问题的一大类潜在事件。

而且,列表内涵不漏的变量,所以,如果你可以使用它们,比这只是一个原因是他们一般都比较好。但它们并不适用于所有情况。

+1

+1:我知道理解不会泄漏变量,但我从来没有把两个和两个放在一起,所以没有看到这个好处。感谢您提出。是的,我的功能太长了,我把它分开了。 – max 2010-11-09 17:18:45

4

如果您希望变量在循环结束后消失,请将循环重构为函数。这样,在函数被调用之后,变量将超出范围并且将被垃圾收集。我建议你a)把这些需要临时变量的函数放在函数中,b)单元测试(因为第二个for循环将不会执行就其本身而言,仅用于for循环的单元测试会捕获你的错误)。

+0

+1:循环的单元测试。至于重构,我同意,但我不能让每个循环都起作用。当它太大而不能仔细阅读时,我喜欢分解函数的方法。 – max 2010-11-09 17:20:12

+0

但是...你如何单元测试一个循环而不使它成为一个单独的函数? – max 2012-11-21 03:35:18

3

尝试增加del temp_variable当你不再需要它。

+0

+1:不知道! – max 2010-11-09 17:15:16

0

尝试运行pylint。它不会直接捕获这样的错误,但它会告诉你何时不使用变量的值。

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 

这不是特别漂亮,但它确实有效,而且你不应该经常需要它。

+0

+1只是在无法在任意位置创建名称空间而挣扎,这似乎是最好的工具(丑陋,因为它......)。 – max 2012-11-21 03:30:54

0

是否有任何编码实践,IDE工具等,这将有助于防止此类错误?

设计第一。代码第二。