Python 中的隐式参数传递?

3
下面的代码来自hackermeter.com,我不确定该怎么想。变量i是被隐式传递给run()函数,还是它需要更多的修改才能完成指定操作?
import sys

def run():
   # Code here!

for i in range(int(sys.stdin.readline())):
   run()

3
不知道 run 应该做什么,就没有必要猜测它如何(或者是否)可以访问 i - chepner
显然不是。下面的答案指出了意图。 - user2725742
问题在于,如果 run 函数没有使用 i 变量,那么它就无关紧要。但是如果 run 函数确实使用了 i 变量,那么这段代码的设计就很糟糕。 - chepner
2个回答

10

我认为这是一种糟糕的编码实践。 run() 能够访问 i 的唯一原因是 i 是全局变量。

以下做法可能更好,因为它会强制程序员显式地将 i 传递给 run() (如果需要):

import sys

def run():
   # Code here!

def main():
   for i in range(int(sys.stdin.readline())):
      run()

if __name__ == '__main__':
   main()

那一定是正在发生的事情。我感谢你的帮助。 - user2725742

3
这是问题中的代码:
import sys

def run():
   # Code here!

for i in range(int(sys.stdin.readline())):
   run()

i在全局作用域中定义(即在模块的顶层),因此可以在run内部访问。这是因为只有函数和类引入新的本地作用域,所以迭代变量是其封闭作用域的普通变量。

如果run访问i,则可能会出现错误,如果i尚未定义(例如,如果条件语句完全阻止了循环的执行)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接