# Weird Python Integers

Note: all of this code was run on my machine using Python 3.6.1. Not everything will work the same if you test using Python 2.

```
>>> a = 42
>>> b = 42
>>> a is b
True
>>> a = 316
>>> b = 316
>>> a is b
False
```

That is suprising! It turns out that all “small integers” with the same value point to the same memory. We can use the Python built-in function `id`

which returns a value you can think of as a memory address to investigate.

```
>>> a = 128
>>> b = 256
>>> id(a)
4504844960
>>> id(b)
4504849056
>>> (id(a) - id(b)) / (a - b)
32.0
```

It looks like there is a table of tiny integers and each integer takes up 32 bytes.

```
>>> x = 1000
>>> y = 2000
>>> id(x)
4508143344
>>> id(y)
4508143312
>>> id(x) - id(y)
32
```

It looks like integers that aren’t in the small integers table also take up 32 bytes. The `id`

for these is way larger than for the small integers which means they are stored somewhere else.

```
>>> id(x) - id(256)
3294288
```

## Editing Integers?

What happens if we change the value of an integer in this table? Python has a module called ctypes that can be misused to directly edit memory. (We could also use a debugger but this way all the examples are in Python.)

Note: this code is very platform dependent. If it doesn’t work you might be using Python 2 instead of Python 3. In Python 2 changing `mutate_int`

so that both instances of 24 are 16 may work.

```
>>> import ctypes
>>>
>>> def mutate_int(an_int, new_value):
... ctypes.memmove(id(an_int) + 24, id(new_value) + 24, 8)
...
>>> a_number = 7
>>> another_number = 7
>>> mutate_int(a_number, 13)
>>> a_number
13
>>> another_number
13
```

Not only have we changed `a_number`

and `another_number`

but all new references to `7`

:

```
>>> for i in range(0, 10):
... print(i)
...
0
1
2
3
4
5
6
13
8
9
```

Even doing math with `7`

no longer works correctly 🎉

```
>>> 7
13
>>> 6 + 1
13
>>> 7 + 1
14
>>> (7 + 1) - 1
13
>>> 7 * 2
26
>>> 0b1111 ^ 0b1000
13
```

P.S. You can read more about the table of small integers in the CPython source code.