【问题标题】:Python name shadowing confusion [duplicate]Python名称阴影混淆[重复]
【发布时间】:2014-05-09 11:29:46
【问题描述】:

所以我有一些类似的代码(这段代码重现了我的问题,即使它没有做任何有用的事情):

def fn():
    l = ["foo", "bar", "baz"]
    print map( lambda f : len(f), l )
    for i, f in enumerate(l):
        print i, f

PyCharm 报告我的 lambda f“阴影名称 f 来自外部范围”的声明。这似乎是因为在下一行中对 enumerate() 的调用中重用了该变量。

代码按预期工作,但这里发生了什么?我认为 Python 决定 ffn 中的局部变量并警告我在 lambda 中使用 f 不会与本地定义的 f 相同 - 即使lambda 首先使用变量名f

除了重命名变量之外,是否有避免这种情况的最佳做法 - 还是我应该根据自己的判断而忽略这种情况下的警告?

【问题讨论】:

  • 如果有什么不同,这在 Python 2.7 中。
  • 只需使用print map(len, l)
  • 这是一个用于说明语言特性的玩具示例,而不是生产代码。

标签: python scope


【解决方案1】:

在函数定义中的任意位置赋值给变量会使其成为函数的局部变量。一个比较典型的例子是

x = 3
def foo():
    print x
    x = 2
foo()

foo 被定义时,x = 2 的存在没有先前的global x 语句使x 成为局部变量。当调用foo 时,调用print x 时还没有定义局部变量x,从而导致UnboundLocalError。有一个同名的全局变量并不重要。

在您的示例中,for 循环是对变量f 的一种隐式赋值,因此ffn 的局部变量。警告是让您知道在评估 len(f) 时,lambda 参数 f 优先于 fn 中的 f 的值。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多