Python &引用;“未绑定本地错误”;报错了线号

Python &引用;“未绑定本地错误”;报错了线号,python,Python,例如: $cat-n foo.py 1定义f(): 2 str=len 3 str=str('abc') 4#len=len('abc') 5 f() $python2.7 foo.py $ 它运行成功,因此第2行和第3行没有问题。但在我取消注释第4行之后: $cat-n bar.py 1定义f(): 2 str=len 3 str=str('abc') 4 len=len('abc') 5 f() $python2.7bar.py 回溯(最近一次呼叫最后一次): 文件“bar.py”,第5行

例如:

$cat-n foo.py
1定义f():
2 str=len
3 str=str('abc')
4#len=len('abc')
5 f()
$python2.7 foo.py
$
它运行成功,因此第2行和第3行没有问题。但在我取消注释第4行之后:

$cat-n bar.py
1定义f():
2 str=len
3 str=str('abc')
4 len=len('abc')
5 f()
$python2.7bar.py
回溯(最近一次呼叫最后一次):
文件“bar.py”,第5行,在
f()
文件“bar.py”,第2行,在f中
str=len
UnboundLocalError:赋值前引用的局部变量“len”
$

现在它报告了错误,因此未注释的行#4肯定有问题,但为什么在第#2行报告回溯错误?

在L4注释后,
len
被解析为函数
len()


在取消注释L4之后,
len
被解析为局部变量。

编程常见问题解答中有一个答案

这是因为当您对作用域中的变量进行赋值时, 该变量成为该范围的局部变量,并以类似方式隐藏 外部作用域中的命名变量

请在此阅读全文:

当LeN被注释时,它被认为是内置函数

def():
str=len
打印类型(str)
str=str('abc')
#len=len('abc')
打印类型(len)
f()

只是提醒一下:你最近回答的一个问题的作者为什么删除了你的答案,以防你想参与进来。
def f():
    str = len
    print type(str)
    str = str('abc')
    # len = len('abc')
    print type(len)

f()

<type 'builtin_function_or_method'>
<type 'builtin_function_or_method'>