48

My question is why do a MySQL row's integer values have an 'L' suffix? Here are the details:

The following dictionary -- artificially formatted here for ease of display --

{'estimated': '', 
 'suffix': '', 
 'typeofread': 'g', 
  'acct_no': 901001000L, 
  'counter': 0, 
  'time_billed': datetime.datetime(2012, 5, 1, 9, 5, 33), 
  'date_read': datetime.datetime(2012, 3, 13, 23, 19, 45), 
  'reading': 3018L, 
  'meter_num': '26174200'}

is comprised of a MySQL database table's columns zipped with the result of reading once from the table.

I can remove the 'L' by passing these values into int(), so if that dictionary were in a variable named snapped_read, I could do this:

int(snapped_read['reading']) and 3018L would change to 3018.

I'm just curious as to why integers show up this way.

octopusgrabbus
  • 10,555
  • 15
  • 68
  • 131

3 Answers3

49

Because in versions of Python before Python 3, long integer literals were indicated with an l or L suffix. In Python 3, ints and longs have been merged into just int, which functions pretty much like long used to.

Do note that, technically, Python( 2)'s int was equivalent to C's long, while Python's long was more like a BigNumber-type thing with unlimited precision (which is now the case for Python 3's int type.)

http://docs.python.org/library/stdtypes.html#numeric-types-int-float-long-complex

JAB
  • 20,783
  • 6
  • 71
  • 80
  • 8
    Side note: MySQLdb convert ALL integer types to long type on Python 2.x – Paulo Freitas Aug 01 '12 at 18:09
  • 1
    Interesting to know. It looks like only `BIGINT` would require that, though, so I'm guessing it's for consistency in terms of the Python interface. http://dev.mysql.com/doc/refman/5.6/en/integer-types.html – JAB Aug 01 '12 at 18:10
  • Yeah, don't know why, but even `TINYINT` columns got converted to long type... Needs further investigation, but I also think it's due to the Python's database interface API. – Paulo Freitas Aug 01 '12 at 18:15
13

L is for the long data type.

For example,

age = 24 # int
bankBalance = 20000005L # long
Quentin Pradet
  • 4,691
  • 2
  • 29
  • 41
Kalpesh
  • 5,635
  • 2
  • 23
  • 39
  • 8
    You need a `long` to contain your bank balance? Shouldn't you be sipping lemonade by a pool somwhere? What are you doing answering questions on SO? (+1) -- although you might want to change your comments from `//` to `#`. – mgilson Aug 01 '12 at 17:53
  • Sorry @mgilson I am a PHP guy :) – Kalpesh Aug 01 '12 at 17:58
  • 1
    In Python you code just `age = 24` and `bankBalance = 20000005L`, no type definitions neither semicolons to end statements. :) – Paulo Freitas Aug 01 '12 at 18:06
  • I wish I needed a long to keep my bank balance!! **:D** – Savir Aug 14 '12 at 16:08
8

Because they're not exactly integers, they are 'longs'.

http://docs.python.org/library/stdtypes.html#typesnumeric

They usually don't offer too much trouble, though

>>> a=1
>>> b=long(1)
>>> a
1
>>> b
1L
>>> a==b
True

Other stackoverflow question about this: here

Community
  • 1
  • 1
Savir
  • 17,568
  • 15
  • 82
  • 136