IPython调用函数报NameError:linear_activation_forward未定义求助
别着急,咱们一步步来捋清楚这个IPython里的命名空间问题,以下是几个常见的原因和验证方法:
先确认Cell 1是否真的在当前Kernel会话中执行成功
IPython的变量和函数是绑定在当前Kernel进程里的,如果你在运行Cell 4之前,Kernel被重启过,或者Cell 1没有被执行(比如误点了跳过,或者执行时的输出被你忽略了),那linear_activation_forward根本就没被定义到当前命名空间里。
验证方法:在Cell 4的前面加一个单元格,运行print('linear_activation_forward' in dir()),如果输出是False,说明这个函数确实不在当前环境里,重新执行Cell 1即可。检查单元格的执行顺序是否正确
虽然你说单独运行每个单元格都没问题,但整体运行时的顺序可能出问题了。比如你先运行了Cell 2(定义L_model_forward),再运行Cell 1(定义linear_activation_forward),那L_model_forward在定义时引用的linear_activation_forward是不存在的——但单独运行Cell 2时你可能已经先跑过Cell 1了,所以当时没报错。
正确的执行顺序应该是:Cell 1 → Cell 2 → Cell 3 → Cell 4,确保每个依赖的函数都在被调用前就已经定义好。排查函数的作用域和拼写问题
检查Cell 1里的函数定义:- 有没有拼写错误?比如函数名写成了
linear_activation_forwad少了一个r,或者大小写不一致(IPython是大小写敏感的)。 - 函数是不是被嵌套定义了?比如
linear_activation_forward被写在了另一个函数或者if语句块里面,导致外部无法访问到这个函数。比如Cell 1里的代码缩进错误,def语句属于某个未执行的代码块。
- 有没有拼写错误?比如函数名写成了
确认没有意外覆盖或删除函数
检查有没有其他单元格里的代码不小心删掉了这个函数,比如执行了del linear_activation_forward,或者定义了同名的变量(比如linear_activation_forward = 0)覆盖了函数对象。可以在Cell 4前运行type(linear_activation_forward)看看,如果报错说明不存在,如果输出不是function说明被覆盖了。
内容的提问来源于stack exchange,提问作者Gerrit

