为了账号安全,请及时绑定邮箱和手机立即绑定

在函数内部,在内部函数定义之前调用,报错

/ 猿问

在函数内部,在内部函数定义之前调用,报错

森栏 2019-02-20 23:19:33
def str(s):
print 'global str()'


def foo():
    str('dummy')
    def str(s):
        print 'closure str()'
    str('dummy')

def bar():
    str('dummy')
    print 'call'


foo()
bar()

现象: 在foo()函数里面 第一次调用str的时候 提示:

UnboundLocalError: local variable 'str' referenced before assignment

问题:
1. 在运行foo()的时候,第一次调用str, foo本地命名空间没有str的定义,这时候要去外部找str, 为什么会找不到外部定义的str
2. foo内部有str的定义, 解释器第一次读入foo定义的时候, 内部的str要怎么处理
3. 为什么会报这个错误, 类似的bar(), 为什么能够找到外部的str

谢谢~~

查看完整描述

1 回答

?
蝴蝶不菲

https://docs.python.org/2/reference/executionmodel.html

If a name binding operation occurs anywhere within a code block, all
uses of the name within the block are treated as references to the
current block. This can lead to errors when a name is used within a
block before it is bound. This rule is subtle. Python lacks
declarations and allows name binding operations to occur anywhere
within a code block. The local variables of a code block can be
determined by scanning the entire text of the block for name binding
operations.

查看完整回答
反对 回复 2019-03-01

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信