Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么会出现名称错误:name';柜台';未定义,而我将计数器变量设置为全局?_Python_Python 3.x_Global Variables_Counter_Nameerror - Fatal编程技术网

Python 为什么会出现名称错误:name';柜台';未定义,而我将计数器变量设置为全局?

Python 为什么会出现名称错误:name';柜台';未定义,而我将计数器变量设置为全局?,python,python-3.x,global-variables,counter,nameerror,Python,Python 3.x,Global Variables,Counter,Nameerror,下面是我的代码。我不知道我做错了什么,但是当我运行这个程序时,我得到了NameError:name'counter'没有定义。我正在从教科书上学习Python,根据教科书,我的代码是正确的。我找不到教科书代码和这个代码之间的区别。。。我在stackoverflow上看到了关于全局变量的其他问题,但我仍然不知道我做错了什么。为什么会出现这个错误?如何解决呢 更新: 我知道我做错了什么。我应该在函数上方写入counter=0 def rpower(a, n): 'returns a to t

下面是我的代码。我不知道我做错了什么,但是当我运行这个程序时,我得到了NameError:name'counter'没有定义。我正在从教科书上学习Python,根据教科书,我的代码是正确的。我找不到教科书代码和这个代码之间的区别。。。我在stackoverflow上看到了关于全局变量的其他问题,但我仍然不知道我做错了什么。为什么会出现这个错误?如何解决呢

更新: 我知道我做错了什么。我应该在函数上方写入counter=0

def rpower(a, n):
    'returns a to the nth power'
    global counter          # counts number of multiplications

    if n == 0:
        return 1
    # if n > 0:
    tmp = rpower(a, n//2)

    if n%2 == 0:
        counter += 1
        return tmp*tmp      # 1 multiplication

    else:
        counter += 2
        return a*tmp*tmp    # 2 multiplications

print(rpower(2, 10000))

可能是您的
计数器
变量在您的
函数
之外声明。比如:

counter=0
def rpower(a, n):
    'returns a to the nth power'
    global counter          # counts number of multiplications

    if n == 0:
        return 1
    # if n > 0:
    tmp = rpower(a, n//2)

    if n%2 == 0:
        counter += 1
        return tmp*tmp      # 1 multiplication

    else:
        counter += 2
        return a*tmp*tmp    # 2 multiplications
print(rpower(2, 10000))

我用PyCharm重写了你的代码。只是更改了函数的名称,因为您的代码不能仅通过ctrl+v工作:

def rpow(a, n):
global counter

if n == 0:
    return 1

tmp = rpow(a, n/2)

if n%2 == 0:
    counter += 1
    return tmp*tmp
else:
    counter += 2
    return a*tmp*tmp
打印(rpow(210000))

我不知道您的错误,但我已达到
RecursionError:相比之下超过了最大递归深度


试着做同样的事情。

请纠正我没有在我的功能之外声明我的计数器。如果我在函数外添加counter=0,我在IDLE中不会出现错误,而且一切似乎都正常。但是,如果我在Pycharm中运行这段代码,我仍然会得到NameError。我刚刚在Pycharm中运行了这段代码,它没有任何错误。你的缩进正确吗?缩进是正确的。我想是计数器=0在我没有写的函数上面,导致了错误。现在,它在空闲状态下工作。谢谢如果您编写tmp=rpow(a,n//2)而不是tmp=rpow(a,n/2),您将不会得到递归错误。这是因为如果使用n/2,n永远不会达到0。如果n永远不会变为0,则永远不会到达basecase('If n==0'),函数也永远不会结束。这就是为什么会出现递归错误。使用n//2,n最终将达到0,基本情况运行,函数结束:)