Velocity Reviews > 2 + 2 = 5

# 2 + 2 = 5

Laszlo Nagy
Guest
Posts: n/a

 07-05-2012
On 2012-07-04 21:37, Paul Rubin wrote:
> I just came across this (https://gist.github.com/1208215):
>
> import sys
> import ctypes
> pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5))
> five = ctypes.cast(id(5), pyint_p)
> print(2 + 2 == 5) # False
> five.contents[five.contents[:].index(5)] = 4
> print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...)
>
> Heh. The author is apparently anonymous, I guess for good reason.

>>> five.contents[five.contents[:].index(5)] = 4
>>> 5

4
>>> 5 is 4

True

But this I don't understand:

>>> 5+0

4
>>> 5+1

4
>>> 5+2

6

MRAB
Guest
Posts: n/a

 07-05-2012
On 05/07/2012 15:34, Laszlo Nagy wrote:
> On 2012-07-04 21:37, Paul Rubin wrote:
>> I just came across this (https://gist.github.com/1208215):
>>
>> import sys
>> import ctypes
>> pyint_p = ctypes.POINTER(ctypes.c_byte*sys.getsizeof(5))
>> five = ctypes.cast(id(5), pyint_p)
>> print(2 + 2 == 5) # False
>> five.contents[five.contents[:].index(5)] = 4
>> print(2 + 2 == 5) # True (must be sufficiently large values of 2 there...)
>>
>> Heh. The author is apparently anonymous, I guess for good reason.

>
> >>> five.contents[five.contents[:].index(5)] = 4
> >>> 5

> 4
> >>> 5 is 4

> True
>
> But this I don't understand:
>
> >>> 5+0

> 4

5 is interned as 4, 0 is interned as 0, 4+0 is calculated as 4 and then
interned as 4.

> >>> 5+1

> 4

5 is interned as 4, 1 is interned as 1, 4+1 is calculated as 5 and then
interned as 4.

> >>> 5+2

> 6
>

5 is interned as 4, 2 is interned as 2, 4+2 is calculated as 6 and then
interned and 6.

Simple really!

Devin Jeanpierre
Guest
Posts: n/a

 07-05-2012
On Thu, Jul 5, 2012 at 10:34 AM, Laszlo Nagy <(E-Mail Removed)> wrote:
>>>> 5+1

> 4

4 + 1 is 5 is 4.

(e.g. try 2+3 as well).

-- Devin

Steven D'Aprano
Guest
Posts: n/a

 07-05-2012
On Thu, 05 Jul 2012 15:57:53 +0200, Hans Mulder wrote:

> On 5/07/12 07:32:48, Steven D'Aprano wrote:
>> On Wed, 04 Jul 2012 23:38:17 -0400, Terry Reedy wrote:
>>
>>> If I run the script in 3.3 Idle, I get the same output you got. If I
>>> then enter '5-2' interactively, I still get 3. Maybe the constant
>>> folder is always on now.

>>
>> Yes, I believe constant folding is always on, since Python 2.4 if I
>> remember correctly. Somebody who cares more than me can possibly check
>> the "What's New" documents

>
> It's not a difference between 2.4 and 3.3; the difference is between
> Idle and the command-line version of the interactive interpreter.
>
> If I type the same code into Idle and the interactive interpreter (both
> using 3.3alpha1), I get 3 in Idle and 2 in Terminal.
>
> I don't quite understand why this difference exists.

This difference exists because you are mucking about with implementation
details of Python, changing things which are not guaranteed by the
language, in ways that you are not supposed to change them. Since
changing the value of the int 2 into that of 3 is not supported, you can
hardly expect consistent behaviour. You're lucky that you don't get a
segfault. (In fact, if you keep playing around with it, you likely will
get a segfault.)

Idle does many things differently to the basic Python interpreter. This
should not surprise you. You should be surprised if it *does* work the
same in Idle and the basic Python interpreter.

--
Steven

Alexander Blinne
Guest
Posts: n/a

 07-05-2012
On 05.07.2012 16:34, Laszlo Nagy wrote:
>>>> five.contents[five.contents[:].index(5)] = 4
>>>> 5

> 4
>>>> 5 is 4

> True

That's surprising, because even after changing 5 to 4 both objects still
have different id()s (tested on Py2.7), so 5 is 4 /should/ still be
False (But isn't on my 2.7). But that's some implementation detail we
are not supposed to play with

> But this I don't understand:
>
>>>> 5+0

> 4
>>>> 5+1

> 4
>>>> 5+2

> 6

That's easy:

5+0 is actually 4+0, because 5 == 4, so 5+0 gives 4.
5+1 is actually 4+1, which is 5, but 5 is again 4.
5+2 is 4+2 which is 6.

Greetings

Hans Mulder
Guest
Posts: n/a

 07-05-2012
On 5/07/12 19:03:57, Alexander Blinne wrote:
> On 05.07.2012 16:34, Laszlo Nagy wrote:
>>>>> five.contents[five.contents[:].index(5)] = 4
>>>>> 5

>> 4
>>>>> 5 is 4

>> True

> That's surprising, because even after changing 5 to 4 both objects still
> have different id()s (tested on Py2.7), so 5 is 4 /should/ still be
> False (But isn't on my 2.7). But that's some implementation detail we
> are not supposed to play with

On my 2.7, id(5) gives the same value as id(4) == id(2+2), but id(2+3)
has a different value. The 'is' operator is consistent with 'id':

>>> 4 is 5

True
>>> 2+2 is 2+3

False

This is when using the interactive interpreter; it may be different
in Idle.

-- HansM

Evan Driscoll
Guest
Posts: n/a

 07-05-2012
On 01/-10/-28163 01:59 PM, Alexander Blinne wrote:
> 5+0 is actually 4+0, because 5 == 4, so 5+0 gives 4.
> 5+1 is actually 4+1, which is 5, but 5 is again 4.
> 5+2 is 4+2 which is 6.

Now all I can think is "Hoory for new math, new-hoo-hoo math"

Evan

Andrew Cooper
Guest
Posts: n/a

 07-05-2012
On 05/07/2012 22:46, Evan Driscoll wrote:
> On 01/-10/-28163 01:59 PM, Alexander Blinne wrote:
>> 5+0 is actually 4+0, because 5 == 4, so 5+0 gives 4.
>> 5+1 is actually 4+1, which is 5, but 5 is again 4.
>> 5+2 is 4+2 which is 6.

>
> Now all I can think is "Hoory for new math, new-hoo-hoo math"
>
> Evan

It wont do you a bit of good to read new math!

(My mind was on exactly the same track)

~Andrew

Steven D'Aprano
Guest
Posts: n/a

 07-06-2012
On Thu, 05 Jul 2012 16:46:48 -0500, Evan Driscoll wrote:

> On 01/-10/-28163 01:59 PM, Alexander Blinne wrote:
>> 5+0 is actually 4+0, because 5 == 4, so 5+0 gives 4. 5+1 is actually
>> 4+1, which is 5, but 5 is again 4. 5+2 is 4+2 which is 6.

>
> Now all I can think is "Hoory for new math, new-hoo-hoo math"

+1 QOTW

--
Steven

samuel.marks@orionvm.com.au
Guest
Posts: n/a

 07-15-2012
On Friday, July 6, 2012 8:39:58 AM UTC+10, Andrew Cooper wrote:
> On 05/07/2012 22:46, Evan Driscoll wrote:
> &gt; On 01/-10/-28163 01:59 PM, Alexander Blinne wrote:
> &gt;&gt; 5+0 is actually 4+0, because 5 == 4, so 5+0 gives 4.
> &gt;&gt; 5+1 is actually 4+1, which is 5, but 5 is again 4.
> &gt;&gt; 5+2 is 4+2 which is 6.
> &gt;
> &gt; Now all I can think is &quot;Hoory for new math, new-hoo-hoo math&quot;
> &gt;
> &gt; Evan
>
> It wont do you a bit of good to read new math!
>
> (My mind was on exactly the same track)
>
> ~Andrew

+1