Most arguments关于为什么做出设计决策以使循环变量不在循环中本地化,这表明存在流行的用例。
明显的用例是:
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 :(得分:0)
没有100%安全的方法来依赖在for循环中设置的变量,除非你可以100%确定迭代器永远不会为空。要实现100%保证,您可以执行for x in iterator or [None]:
之类的操作,但这会产生类似的“记住这样做”的问题。它可能比设置默认值更“pythonic”,但默认值可能更清晰。完全依赖for循环范围与if (condition): x = something
类似,然后考虑如果我在条件为假时调用x会怎么样?你可能不会编写这样的代码,为什么要为for循环呢?我喜欢习惯于声明所有将在前台外使用的变量(例如,在函数开头将所有变量设置为None或其他默认值),但它只是归结为偏好。
答案 1 :(得分:0)
我同意循环没有自己的范围的最明显的原因是在将值分配给外部范围中的变量时会引入的复杂性。
但这并不一定意味着迭代的价值。请考虑以下事项:
total = 0
for item in some_list:
total += item
如果循环有自己的变量范围,实现这将是一场噩梦。
其中一个后果是item
也可以在循环中出现,但这并不意味着有一种很好的方式(或者你说" safe" 方式)使用它。
你可以使用它,但是你必须要小心。