【问题标题】:Python error: NameError: name is not defined [duplicate]Python错误:NameError:名称未定义[重复]
【发布时间】:2020-09-29 14:44:40
【问题描述】:
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 行,在 打印('重量:',重量) NameError: name 'weight' 没有定义

我是 Python 新手,我不明白为什么变量“权重”显然是在 grad_d() 下定义的,但它却是未定义的。

【问题讨论】:

  • 在定义weight之前调用print(weight)

标签: python undefined nameerror


【解决方案1】:

你只是忘了调用你的函数 试试:

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

【讨论】:

    【解决方案2】:

    这是因为'weight'变量不在全局范围内,只能在函数内部工作。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        其次,deltaweight 是一个形状为 (2,) 的 numpy 数组。因此,您需要确定要比较的两个元素中的哪个元素。如果您想比较这两个元素,您可以使用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)
        

        【讨论】:

        • 感谢您的评论。我现在似乎收到了这个错误: Traceback (last recent call last): File "c:/Users/Desfios 5/Desktop/Python/gradientdescent.py", line 21, in weight, i = grad_d() File “c:/Users/Desfios 5/Desktop/Python/gradientdescent.py”,第 14 行,在 grad_d deltaweight = - learnrate * opt.rosen_der(weight) UnboundLocalError:分配前引用的局部变量“权重”
        • 没关系。那是我自己的错。在尝试您的建议时,我曾尝试在 def grad_d() 之上定义权重。将其移回其下方后,您的建议效果很好。谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 2020-06-17
        • 2016-07-06
        相关资源
        最近更新 更多