Destroy doesn't work when also instantiating new objects

I got this function to create a few button elements:

 //Keep track of added perk buttons
 List<GameObject> displayedPerkButtons = new List<GameObject>();
 //Adds perk buttons based on the current chosenPerks.
    void PopulatePerkChooser()
        //Removes any old perk buttons if present
        if (displayedPerkButtons.Count > 0)
            for (int i = 0; i < displayedPerkButtons.Count; i++)


//For each perk in chosenPerks, instantiate a new PerkButton, run its construct function passing along the specific perk, and add it to the displayedPerkButtons list for future removal
for (int i = 0; i < PerkManager.Instance.chosenPerks.Count; i++)
GameObject newPerkButton = Instantiate(perkTemplate, perkButtonContainer.transform);

//Constructs “Random perk” button at the end, and add this as well to displayedPerkButtons
GameObject randomPerkButton = Instantiate(randomPerkTemplate, perkButtonContainer.transform);
It generates the buttons just fine, but it fails to destroy any old buttons if it is run more than once. Interestingly, if I make a second function that only contains the removal part, and run that separately after the first function, it removes the buttons as intended - so something seems to be wrong with how it interacts with the creation of the new buttons.
What might I be missing here?

Turns out the issue was due to the list of actual buttons to use - that list didn’t clear properly so it added copies of the same buttons to replace the deleted ones.