Also, if you're using pygame, it is based on SDL. I'm reckoning the images you're displaying need to be stored somewhere. Even if you're just using ASCII, I think it might render it to a bitmap. Bitmaps can take absurd amounts of space. For example, a 800x600 pixel screen, with typical 32bit per pixel representation will take up almost 2 megabytes.
On another note, and if you're using bitmaps and the like, don't forget to store them in a single place. For example, ground tiles can be represented by a simple dot. If you render this dot for each ground tile, you'll use up a lot of memory for bitmaps. If you render it once, and then draw that single bitmap several times in different places, you'll be saving a lot of memory. Don't know if you're doing it this way.
This can be widened to other things other than bitmaps. For example, a TerrainTile class could be instantiated once for each type of terrain (wall, ground, water, etc), defining attributes such as whether it's passable, if it's an obstacle, base movement speed over it, and some other things (not position). Then each ACTUAL, positioned tile (with an X, Y position) only has to point to these terrain information classes, and not maintain a copy of that information (which would lead to duplicates/redundancy, increasing memory usage).
I'm never sure if I explained stuff in a sensible way, so feel free to ask any questions at all!
I'd love to help further!