Python 3 Count在函数内更新,但值不在函数外更新

时间:2018-12-19 02:00:39

标签: python python-3.x recursion

我猜这里有一个示波器问题,我错过了某个地方。此函数将所有数字平方并加在一起。如果数字达到1或89,它应该停止,否则继续前进。这是我的代码:

count = 0
def chain(x,count):
    x = str(x)
    temp = 0
    for let in range(0,len(x)):
        temp = temp + (int(x[let]) ** 2)
    x = temp
    print("\n")
    print(temp)
    if x == 89:
      count = count + 1
      print(count)
    elif x == 1:
      return False
    else:
        chain(x, count)

 chain(145, 0)

  print(count)

问题是,当我在x == 89时打印计数时,我得到1。但是当我在最后打印计数时,它显示为0。我查看了一下,但似乎没有设置它可以用于其他任何东西,我也尝试过添加return,return count,return True,但似乎没有任何解决方法。如果有人指出我的错误,我将不胜感激!

3 个答案:

答案 0 :(得分:4)

解决方案1: 将count设为全局变量

count = 0
def chain(x):
    global count
    x = str(x)
    temp = 0
    for let in range(0,len(x)):
        temp = temp + (int(x[let]) ** 2)
    x = temp
    print("\n")
    print(temp)
    if x == 89:
      count = count + 1
      print(count)
    elif x == 1:
      return False
    else:
        chain(x)

chain(145)

print(count)

解决方案2: 返回计数并在递归调用时接收。

def chain(x,count):
    x = str(x)
    temp = 0
    for let in range(0,len(x)):
        temp = temp + (int(x[let]) ** 2)
    x = temp
    print("\n")
    print(temp)
    if x == 89:
      count = count + 1
      print(count)
    elif x == 1:
        pass  # you may want to use -1 or something as flag
    else:
      count = chain(x, count)
    return count


print(chain(145,0))

答案 1 :(得分:1)

这是两个具有相同名称的不同变量。当函数内部的计数变为零时,函数外部的计数将不会更改,因此最终打印将为0

答案 2 :(得分:1)

好吧,因为它是原始类型,所以计数不完全是一个引用,因此您不会每次都得到相同的对象(它是不可变的)。

此外,您在函数外部引用的计数与您最初传递的计数不同(因为您的第一个调用会向其提供0,而不是相同的变量)。

  1. 通过从函数参数中删除全局变量并使用修饰符global
  2. 来对全局变量进行计数

示例

count = 0
def chain(x):
    global count
    ...
  1. 将count设置为可变类型,并从一开始就将其传递(例如,Class,Dict,list)。

示例

line 01: count = {'total': 0}
line 20: chain(145, count)