Proper data structure to represent a Sudoku puzzle?
Others have reasonably suggested simply using a 2D array.
I note that a 2D array in most language implementations (anything in which that is implemented as "array of array of X" suffers from additional access time overhead (one access to the top level array, a second to the subarray).
I suggest you implement the data structure abstractly as a 2D array (perhaps even continuing to use 2 indexes), but implement the array as single block of 81 cells, indexed classically by i*9+j. This gives you conceptual clarity, and somewhat more efficient implementation, by avoiding that second memory access.
You should be able to hide the 1D array access behind setters and getters that take 2D indexes.  If your language has the capability (dunno if this is true for Python), such small methods can be inlined for additional speed.
What would be a smart data structure to use to represent a Sudoku puzzle? I.e. a 9X9 square where each "cell" contains either a number or a blank.
Special considerations include:

Ability to compare across row, column, and in 3X3 "group
Ease of implementation (specifically in Python)
Efficiency (not paramount)

I suppose in a pinch, a 2D array might work but that seems to be a less than elegant solution. I just would like to know if there's a better data structure.