Create an array of scripts that don't affect each other?

Maybe im approaching this situation the wrong way but im trying to make a 2d array of scripts named block and have access to each blocks methods. Each block has to be initialized to a block so i have a public block Blocks that i use to initialize the array. However when i do this and try to access a method of one block later in code it affects all blocks. Example: blocks[2, 2].changecol(2);. I assumed each Block in the array would receive its own copy of the script that i can access later. But it seems they are all referencing the same public Block Blocks.

Question: How make it so each block in the array has its own script so they don’t affect each other. (code Below)

 public Block  Blocks;
 Block [,] blocks = new Block[5, 4];
    
            for(int i=0; i<= 4; i++)
            {
                for(int n= 0; n<=3; n++)
                {
                    blocks[i , n ] = Blocks;
                }
             }

Also am i going about this problem in the wrong way using scripts. Ultimately i want to be able to spawn blocks at run-time and access a specific blocks methods in code during run-time. The blocks are grid bases so i use the array to tell the location and spacing of blocks like a x and y coordinate value.

Solved: To fix it so that each block wasn’t referring to the same block i Instantiated a new block every time.

Instead of blocks[i , n ] = Blocks .

I used: blocks[i - 1, n - 1] = Block.Instantiate(Blocks, blockposition, transform.rotation) as Block;