Python错误:NameError:名称未定义

时间:2020-09-29 14:44:40

标签: python undefined nameerror

import numpy as np
from scipy import optimize as opt
import time

def grad_d():
    weight = [0, 0]
    learnrate = 0.01
    tol = 1.e-5
    itmax = 1000

    for i in range(itmax):
        deltaweight = - learnrate * opt.rosen_der(weight)
        weight = weight + deltaweight
        if abs(deltaweight) < learnrate:
            break
    
    return weight, i
    
print('Weight: ', weight)
print('Iterations: ', i)

运行代码后,我收到错误消息:

“文件“ c:/ Users / Desfios 5 / Desktop / Python / gradientdescent.py”,第19行 print('Weight:',weight) NameError:名称“ weight”未定义

我是Python的新手,我不明白为什么说变量“ weight”显然是在grad_d()下定义的,所以未定义。

4 个答案:

答案 0 :(得分:3)

您只是忘了调用函数 试试:

weight, i = grad_d()
print('Weight: ', weight)
print('Iterations: ', i)

答案 1 :(得分:0)

weight在函数grad_d()的范围内定义。它以外的任何代码都看不到它。请研究范围的工作原理。

答案 2 :(得分:0)

这是因为'weight'变量不在全局范围内,并且仅在函数内部起作用。

您可以在全局级别上定义它来解决。

weight = [0, 0]移到def grad_d()之外应该可以解决问题

答案 3 :(得分:0)

首先,您没有调用该方法。这样做:

weight, i = grad_d()
print('Weight: ', weight)
print('Iterations: ', i)

第二,deltaweight是形状为(2,)的数字数组。因此,您需要确定要比较的两个元素中的哪个。如果要比较两个元素,则可以使用deltaweight.any()deltaweight.all()。 您的整个代码将是这样(假设您正在比较deltaweight数组的第一个元素)

import numpy as np
from scipy import optimize as opt
import time

def grad_d():
    weight = [0, 0]
    learnrate = 0.01
    tol = 1.e-5
    itmax = 1000

    for i in range(itmax):
        deltaweight = - learnrate * opt.rosen_der(weight)        
        weight = weight + deltaweight
        if abs(deltaweight[0]) < learnrate:
            break
    
    return weight, i

weight, i = grad_d()
print('Weight: ', weight)
print('Iterations: ', i)