Implicit recursion when assigning the return of a function to a variable?

Asked

Viewed 70 times

0

Speak guys, I’m starting studies in Python and I came across a behavior a little strange for me. It’s this: I have a file test py. which contains some functions. In another file, exempl1.py imported this and other files as modules. In the file exempl1.py created a 3 functions(funct1, func2, funct3). In the funct1 i am passing as parameters: a list and reference of a function defined in test py.. Within funct1 I assigned the return of func2 to 3 variables, all with the same parameters for func2:

a = func2(x_best,h,0.1)
b = func2(x_best,h,0.1)
c = func2(x_best,h,0.1)

However, the variables are receiving the values as if func2 was executed 3 times, always receiving as parameters its own return from the previous execution. Another thing I realized is that if I declare only two variables, the values assigned to the variables is the equivalent of two executions of func2 receiving as parameters the return of the previous execution. My question is: is there an implicit recursion happening according to the amount of variables I declare??? I’m quite confused by these results.

Below I will leave the codes so that it is more clear what I am trying to say. I will omit some functions because they do not interfere with the problem. Thanks for your help.

test py.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import math
import json
from openpyxl import *
from random import *
from math import *

def beale ():
    return (1.5 - ponto[0]+ponto[0]*ponto[1])**2+(2.25-ponto[0]+ponto[0]*ponto[1]**2)**2+(2.625-ponto[0]+ponto[0]*ponto[1]**3)**2


def tgo(problema):

    pontos = points_generator(100)
    matriz = t_matriz_generator(pontos, problema)
    indices = list() 
    melhores = list()
    for i in range(len(matriz)):
        j = 0
        while (j < 4):
            if(matriz[i][j] < 0):
                break
            if (j >= 3):
                indices.append(i)
            j += 1
    for a in indices:
        melhores.append(pontos[a])
    return melhores, problema

exempl1.py

from random import *
from teste import *
import math
import time

def LineSearch(Xtrial, Xbest, d, h):
    while (problema(Xtrial) < problema(Xbest)):
        Xbest = Xtrial
        h *= 2
        Xtrial[i]=trial_search(Xbest,h,d)
    return Xbest, h

def trial_search(ponto, h, d):
    FinalPoint = ponto
    for i in range(len(FinalPoint)):
        FinalPoint[i] = (FinalPoint[i]+h)*d
        if (problema(FinalPoint) < problema(ponto)):
            continue
        else:
            FinalPoint[i] = ponto[i]
    return FinalPoint

def Unirandi(x0, problema):
    tol = 0.0001
    h = 1.0
    fails = 0
    x_best = x0

    a = trial_search(x_best,h,0.1)
    b = trial_search(x_best,h,0.1)
    c = trial_search(x_best,h,0.1)




p, problema = tgo(beale)
Unirandi([-0.05338583452963963, 4.311503781033389],problema)

The values for the variables are:

a -> [0.11094661416547036, 0.11531150378103339] 
b -> [0.11094661416547036, 0.11531150378103339] 
c -> [0.11094661416547036, 0.11531150378103339]

If I just declare

a = trial_search(x_best,h,0.1)
b = trial_search(x_best,h,0.1)

as a result I have:

a -> [0.10946614165470361, 0.15311503781033392] 
b -> [0.10946614165470361, 0.15311503781033392]

and finally if I declare only

a = trial_search(x_best,h,0.1)

as a result

a -> [0.09466141654703604, 0.531150378103339]

1 answer

0

The problem is that you are instantiating a list in function call Unirandi() (the list [-0.05338583452963963, 4.311503781033389]) and always passing the same instance to the function trial_search(). As the function trial_search() modifies this list, it will yes modify the same list three times.

What you can do to solve is duplicate the list every time you call the function trial_search(). To duplicate a list just do so: list(x_best). In this case the function code Unirandi() would look like this:

def Unirandi(x0, problema):
    tol = 0.0001
    h = 1.0
    fails = 0
    x_best = x0

    a = trial_search(list(x_best),h,0.1)
    b = trial_search(list(x_best),h,0.1)
    c = trial_search(list(x_best),h,0.1)

Thus the variables a, b and c will be of the same value [0.09466141654703604, 0.531150378103339].

Browser other questions tagged

You are not signed in. Login or sign up in order to post.