Generally, I have seen grids represented as lists in lists. I.e. if you want to make the following grid:
A0 B0 C0
A1 B1 C1
A2 B2 C2
you would represent it like so (keeping in mind that arrays/lists in python are zero-indexed:
[[A0, B0, C0],
[A1, B1, C1],
[A2, B2, C2]]
There are of course multiple variations to this sort of thing. One example that springs to mind is that you could store each row as a separate numbered attribute of an object. Since you are using lists (arrays) in your example, I'm going to assume you're going for an list-base representation.
You have variables which I understand as follows: column is the number of columns on the grid's x-axis, and row in the number of rows on the columns y-axis. It's generally good practice to make your variable names as clear as possible, so I'm going to use num_rows and num_cols instead.
If you want to make a grid, first you instantiate your rows, then you add your columns to each row. You could use a list comprehension, but those are probably harder to read that for loops. Using for loops, you would make a grid like so:
SYMBOL = '.' # it is convention in python to name constants in ALL CAPS
grid = []
for x in range(num_rows):
grid.append([])
for y in range(num_cols):
grid[x].append(SYMBOL)
To access a random element, just use python's built-in random number generator.
from random import randint
row = randint(0,num_rows-1)
col = randint(0,num_cols-1)
value = 'whatever you want to put in the random cell'
grid[row][col] = value