[英]Safely using for-loop variables outside the loop
关于为什么要进行设计决策以使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
因此,当迭代器为空时,如果x
之前未定义,则它们引发NameError
。
嵌套循环会使此错误变得更糟:
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
如果在外部循环的第二次或更多次迭代中inner_iterator(y)
为空,则忘记x = default_value
导致产生静默错误而不是异常。
测试这些情况非常困难,因为inner_iterator(y)
并非外部参数,因此除非测试足够幸运,以某种方式可以在空的情况下重新创建该案例,否则不会检测到该错误。
所有用例都是脆弱的,还是有一种安全的方法来依赖for循环变量的作用域规则?
没有100%安全的方法依赖于在for循环内设置的变量,除非您可以100%确保迭代器永远不会为空。 为了获得100%的保证,您可以对it for x in iterator or [None]:
做类似for x in iterator or [None]:
,但这会带来类似的“记住做到这一点”的问题。 它可能比设置默认值更“ pythonic”,但是默认值可以提供更多的清晰度。 整个对for循环作用域的依赖类似于if (condition): x = something
,然后考虑如果条件为false时调用x会怎样? 无论如何,您可能都不会编写这样的代码,所以为什么要进行for循环? 我喜欢养成一种习惯,即声明所有将在外部使用的变量(例如,在函数开始时将所有变量设置为None或其他默认值),但这只是出于偏好。
我同意,循环没有自己的作用域的最明显原因是将值分配给外部作用域中的变量时会引起的复杂性。
但这并不一定意味着迭代的价值。 考虑以下:
total = 0
for item in some_list:
total += item
如果循环具有自己的变量作用域,则执行此操作将是一场噩梦。
后果之一是该item
也可以从循环中获取,但这并不意味着有一种很好的使用方式(或您所说的“安全”方式)。
您可以使用它,但随后必须要小心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.