Modified variable of prefab instantiated in start() resets in update()

So while I was writing this, I found a fix to my problem however, I would be thankful if someone could explain to me why it happens (and maybe my fix will help someone, who knows).

I have an empty GameObject with a script that instantiates a prefab, moves it, and modifies variables in a script attached to said prefab.
While the transform is correctly modified and stays where it is put, any variable modified during the start() function of the empty GameObject will return to the default values I put in the start() function of the prefab.

The fix is to not initialize the value of the variables.

My question is why is the start() function of the prefab called a second time after the end of the start() function of the empty GameObject?

Below is a simplified version of my code that still presents the same behavior.

The empty GameObject:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TowerScript : MonoBehaviour
{
    public GameObject MyPf;
    private prefabType myInstance;
    void Start()
    {
        myInstance = Instantiate(myPf);
        myInstance.GetComponent<PrefabScript>().setValue(42);
    }

    void Update()
    {
        Debug.Log(myInstance.GetComponent<PrefabScript>().getValue());
    }
}

And the prefab script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PrefabScript : MonoBehaviour {
    private int myValue;
    
    void Start()
    {
        myValue = 0;
    }

    public int getMyValue()
    {
        return myValue;
    }

    public void setMyValue(int newVal)
    {
        myValue = newVal;
    }
}

This is due to the execution order of Unity.
https://docs.unity3d.com/Manual/ExecutionOrder.html

When you instantiate prefab, only Awake and OnEnable are called. Later, when your TowerScript Start code has reached the end, Unity calls Start for new object.
Put your default value into Awake or assign it on declaration.