What Does Underscore in a Python Number Mean?

Find out what underscores in a numeric literal means

Starting with Python 3.6, an underscore (_) can be used as a numeric separator between digits, to act as a visual separation:

# Python 3.6+
million = 1_000_000

print(million) # 1000000

You may use it after a decimal point as well:

# Python 3.6+
num = 1_000.101_242

print(num) # 1000.101242

Numeric separators have no semantic meaning, beyond improving readability of (long) numeric literals. In fact, numeric literals are parsed as if the underscores were absent:

# Python 3.6+
million = 1_000_000

print(million == 1000000) # True
print(million == 10_00_000) # True

When using an underscore (_) between digits, the following are considered invalid:

  • When there's more than one underscore between any two digits;
  • When a numeric literal starts or ends with an underscore;
  • When an underscore is used before or after a decimal point (or other "special positions" such as, exponent, number sign, etc.).

For example:

# SyntaxError: invalid decimal literal
100__000
# NameError: name '_100' is not defined
_100
# SyntaxError: invalid decimal literal
100_
# SyntaxError: invalid decimal literal
1_.23
# SyntaxError: invalid decimal literal
1e_23
# SyntaxError: invalid decimal literal
1_e23
# SyntaxError: invalid decimal literal
1e+_23
# SyntaxError: invalid decimal literal
1e-_23
# NameError: name '_1234' is not defined
+_1234
# NameError: name '_1234' is not defined
-_1234

You may use an underscore after base specifiers in numeric literals. For example, the following are all valid:

# Python 3.6+

0b_1011
0B_1011

0o_30_071
0O_30_071

0x_ddd_5
0X_ddd_5

# ...

You may use underscores as numeric separators with the following constructors:

  • int() (with any base);
  • float();
  • complex();
  • Decimal().

For example:

# Python 3.6+
num = int('0b_1111_0000', 2)

print(num) #=> 240

Hope you found this post useful. It was published . Please show your love and support by sharing this post.