You are correct - by default connections have autocommit set to False, so everything you do is batched up, so to speak, until you call Connection.commit (or Cursor.commit in recent source builds).
This makes coding very handy since you put the commit at the bottom of a function. If an exception occurs and the connection is closed (which happens automatically if you don't keep references to it), the transaction is rolled back.