0

I'm trying to writing some codes that defines the outer function including inner function.

def outer():

  t = 1
  
  for i in range(3):

    print(f'## {i}th loop##')
    
    t = inner(t)

  return t

def inner(t):
  print(f't value is now {t}')

  t += 1
  if (t % 10) != 0: # imaginary if-condition to reproduce my original codes
    inner(t)

  return t

outer()

While doing this, I confronted the problem that implementing inner function few times does not change the variable value that was defined with the definition of outer function at the same time.

The result of codes above is:

The result

In first iter, t : 1,2,3,4,5,6,7,8,9
In second iter, t : 2,3,4,5,6,7,8,9 ..

I expected that the t value in the second iteration will start with the value of 10. Would u let me know what the problem is?

  • Would suggest visualizing running your code in [Python tutor](https://pythontutor.com/visualize.html#mode=edit) to better understand how the current code works. Basically, the different invocations of outer and recursive calls to inner run in different stack frames. Outer gets the returned valued fom the first call to inner, not the last recursive call, so that's why its values does not start with 10. – DarrylG Jun 04 '22 at 07:13

2 Answers2

0

The problem is how you are calling:

outer -> inner -> inner -> last inner, etc.

Resulting in t += 1 at the end, from the last inner call.

If you want to get it functional, and still use inner and outer you can do this:

def outer():
    t = 0

    for i in range(3):
        print(f'## {i}th loop##')

        t = inner(t)


def inner(num):

    for j in range(num, num + 10):
        print(f't value is now {j}')
        num += 1

    return num


outer()
farsalis
  • 26
  • 5
0

This issue is in line:

inner(t)

Changes in the recursive calls has no effect on the parent--see How do I pass a variable by reference?.

This can be fixed by changing to:

t = inner(t)

Codes becomes:

def outer():

  t = 1
  
  for i in range(3):

    print(f'## {i}th loop##')
    
    t = inner(t)

  return t

def inner(t):
  print(f't value is now {t}')

  t += 1       # equivalent to t = t + 1 
               # which creates a new local value of t and assigns it to passed in argument t + 1
    
  if (t % 10) != 0: # imaginary if-condition to reproduce my original codes
    t = inner(t)       

  return t

outer()

Output

## 0th loop##
t value is now 1
t value is now 2
t value is now 3
t value is now 4
t value is now 5
t value is now 6
t value is now 7
t value is now 8
t value is now 9
## 1th loop##
t value is now 10
t value is now 11
t value is now 12
t value is now 13
t value is now 14
t value is now 15
t value is now 16
t value is now 17
t value is now 18
t value is now 19
## 2th loop##
t value is now 20
t value is now 21
t value is now 22
t value is now 23
t value is now 24
t value is now 25
t value is now 26
t value is now 27
t value is now 28
t value is now 29
DarrylG
  • 16,732
  • 2
  • 17
  • 23