什么是避免阴影变量的pythonic方法?

WoJ*_*WoJ 23 python variables scope

我经常使用以下代码导致变量阴影或局部变量的乘法

def whenadult(age):
    return 18 - age

age = 5
needtowait = whenadult(age)
Run Code Online (Sandbox Code Playgroud)

age在传递给主函数中的函数时,它具有相同的逻辑角色,所以我想避免l_age在whenadult中创建类似的东西.

什么是解决"阴影与变量乘法"困境的pythonic方法?

更新:跟进一些评论我想说清楚我正在寻找一个Python最佳实践(而不是局部变量和全局变量范围)

aba*_*ert 46

局部变量(和函数参数)age恰好与程序中其他位置的变量同名,这一事实无关紧要.局部变量的重点在于它们只存在于它们所定义的函数的局部范围内.

局部变量与其他地方用作参数的变量同名的事实尤其不是问题.实际上,它在现实代码中非常常见.例如,选择一个随机的stdlib模块,3.3版本cmd,该Cmd.onecmd方法有一个名为的变量line,并将其作为参数传递给self.default方法,该方法将其绑定到也被命名的参数line.

如果你没有同名的局部变量,那么用于参数的变量碰巧是你可以访问的全局变量这一事实不是问题,除非你真的想要访问那个全局变量.您不希望在现有代码中使用,几乎从不应该这样做.在这种情况下,在大多数现实世界的情况下,它只是一个巧合,没有任何意义,也没有任何影响,而不是你必须解决的问题.


您遇到的问题是PyCharm无法猜测您是否希望age可以访问全局whenadult.是否有可能(如果不是在这个微不足道的情况下,可能在更复杂的情况下)人类可能同样困惑,减慢他对你的代码的理解?或者您有一天必须在某些环境中编写代码,在这种环境中,您的代码审阅者或教师或其他任何人会拒绝您的代码,因为它没有通过一些没有警告的linter?也许.

但实际上,在任何这样的环境中,他们可能会抱怨你首先使用全局变量.你真的不需要在这里.唯一的原因age是全局是它必须可以访问顶级代码.如果将该代码移动到函数中,则age可以成为该函数中的本地代码.例如:

def whenadult(age):
    return 18 - age

def main():
    age = 5
    needtowait = whenadult(age)

main() # possibly with an if __name__ == '__main__' guard
Run Code Online (Sandbox Code Playgroud)

这将使PyCharm开心,任何linter工具,以及任何容易混淆或严格思考的人类读者.它甚至可以使你的代码更快一点.另一方面,只有三行和一个缩进的代码更多,但整个程序只有八行长.因此,您可以根据具体情况进行权衡.

  • @Fiver:我的问题来自那里:[PyCharm](http://www.jetbrains.com/pycharm/)警告我阴影,我想我会看到是否有一种pythonic方法来解决这个问题.我想我应该在我的问题中明确表示我理解本地变量和全局变量,并且我想知道最佳实践,而不是代码是否有效(它在两种情况下均有效). (6认同)

Dev*_*evy 5

每当我在 PyCharm 中收到阴影变量的警告时。我会尝试重命名局部变量以使用下划线前缀作为约定。这是除了将全局变量包装到 main() 函数之外的另一种考虑方式。

    def whenadult(_age):
        return 18 - _age

    age = 5
    needtowait = whenadult(age)
Run Code Online (Sandbox Code Playgroud)

  • 当你忘记时容易出错_ (3认同)