python - 避免隐藏变量的pythonic方法是什么?

标签 python variables scope

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

def whenadult(age):
    return 18 - age

age = 5
needtowait = whenadult(age)

age 在传递给函数时与主代码中具有相同的逻辑角色,因此我想避免在 whenadult 中创建类似 l_age 的内容。

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

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

最佳答案

本地变量(和函数参数)age 恰好与程序中其他地方的变量同名这一事实无关紧要。局部变量的全部意义在于它们只存在于定义它们的函数的局部范围内。

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

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


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

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

def whenadult(age):
    return 18 - age

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

main() # possibly with an if __name__ == '__main__' guard

这将使 PyCharm 以及任何 linter 工具以及任何容易混淆或思想僵化的人类读者都感到高兴。它甚至会让你的代码更快一点。另一方面,要阅读的代码更多——只有三行和一个缩进,但整个程序只有八行长。因此,您可以根据具体情况做出权衡。

关于python - 避免隐藏变量的pythonic方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19902127/

相关文章:

python - 如何组合两个不同模型的字段并创建 ModelSerializer

python - 为什么 `subprocess.call` 没有调用命令

python - 修复包含在方法或类中时的 Python 缩进

javascript - 跨多个文件的 Javascript 中的全局变量

c++ - 在类中使用 "enum"时出错

python - mysql for python 2. 7 说找不到 Python v2.7

php - (PHP) 单例数据库类 - 静态方法呢?

java - 静态和最终静态赋值

javascript - 'this' 上下文在赋值过程中丢失,但也不完全丢失?

ruby - 在 Ruby 中继承类级实例变量?