2016-10-08 243 views
1

Most arguments为什么被做了设计决策,使for循环变量本地环路以外表明,有流行的用例。安全使用循环变量循环

明显的使用情况是这样的:

x = default_value 
for x in iterator: 
    # do stuff 
# do something with x here 

遗憾的是,往往第一行遗忘:

# should have set default value for x here 
# but forgot 
for x in iterator: 
    # do stuff 
# do something with x here 

所以当迭代器是空的,他们提出NameError如果x前面没有定义。

这个错误得到与嵌套循环恶化:

for y in outer_iterator: 
    # should have set default value for x here 
    # but forgot 
    for x in inner_iterator(y): 
     # do stuff 
    # do something with x 

这里忘记了x = default_value导致无声的错误,而不是一个异常,如果inner_iterator(y)是通过外循环的第二或后面的迭代空。

测试这些情况很困难,因为inner_iterator(y)不是一个外部参数,所以除非测试足够幸运地以某种方式重新创建情况,否则该错误将不会被检测到。

所有的用例都是脆弱的还是有安全的方法来依赖for循环变量的范围规则?

回答

0

除非可以100%确定迭代器永远不会空,否则没有100%的安全方法依赖于for循环中设置的变量。为了达到100%的保证,你可以做一些类似于for x in iterator or [None]:的事情,但是这提出了类似的“记住去做”的问题。这可能比设置默认值更“pythonic”,但默认值可能会提供更多清晰度。整个依赖于for循环的范围类似于if (condition): x = something之类的东西,然后考虑如果在条件为假时我调用x怎么办?你可能不会这样写代码,那么为什么要这样做for循环?我喜欢使它习惯于声明所有将在外部使用的变量(例如,在函数的开头将所有变量设置为None或其他默认值),但这只是归结于优先级。

0

我同意循环没有自己的作用域的最明显的原因是将外部作用域中的变量赋值时引入的复杂性。

但是,这并不一定意味着迭代的值。考虑以下几点:

total = 0 
for item in some_list: 
    total += item 

如果循环有自己的变量范围,实施这将是一场噩梦。

其中onsequences的是,item也avaialable圈外的,但是,这并不真正意味着有一个很好的方式(或者如你所说“安全”方式)来使用它。

你可以使用它,但你必须小心。