Modify int in place

0 votes

This is more of a curiosity

Say I have the following code

>>> my_immutable = (1, 2)
>>> my_immutable[0] += 1

TypeError: 'tuple' object does not support item assignment

This is expected, because unlike C, Python does not modify the underlying int, but rather creates a new one (observed in the code below)

>>> x = 1
>>> id(x)
33156200
>>> x += 1
>>> id(x)
33156176

If I want to modify the underlying integer in the tuple, I can hackly do something like

>>> hacked_immutable = ([1], [2])
>>> hacked_immutable[0][0] += 1
>>> hacked_immutable
([2], [2])

My question is: is there a nicer way of doing it (ideally performant and ideally already in the standard library)? Some wrapper class around int maybe?

Edit: I did not have a specific software that had to adhere to this. It was more of a thought exercise of why are things like this. I think the three questions I had were:

  • Why are ints immutable? (still not sure)

  • Is there a way to force them to be mutable? (wim's answer)

  • Is there a nice way to force them to be mutable (like Integer vs int in Java) - I think the answer is NO?

Thanks a lot for the discussion!

Sep 14, 2018 in Python by bug_seeker
• 14,970 points
17 views

1 answer to this question.

Your answer

Your name to display (optional):
Privacy: Your email address will only be used for sending these notifications.
0 votes

Use a list rather than a tuple:

my_container = [1, 2]

tuple is immutable - you can't modify them.

int is immutable - you can't modify them.

The closest you can get is using ctypes to monkeypatch the value. But this is not "nice" by any stretch of the imagination and you will probably segfault your Python runtime if anything else happens to be using that integer.

>>> t = (42, 43)
>>> import ctypes
>>> ctypes.cast(id(42), ctypes.POINTER(ctypes.c_int))[6] = 666
>>> t
(666, 43)
answered Sep 14, 2018 by Priyaj
• 56,120 points

Related Questions In Python

0 votes
1 answer

How to round a floating point number up to certain decimal place in Python?

This is normal (and has nothing to do ...READ MORE

answered Oct 8, 2018 in Python by charlie_brown
• 7,710 points
20 views
0 votes
1 answer

How to fix this? ValueError: invalid literal for int() with base 10 error in Python

The following are totally acceptable in python: passing ...READ MORE

answered Nov 16, 2018 in Python by Nymeria
• 3,500 points
3,466 views
0 votes
1 answer

Sort a part of a list in place

You can write it as such: a[i:j] = ...READ MORE

answered Feb 12 in Python by SDeb
• 9,660 points
16 views
+3 votes
7 answers

How can I rename a file in Python?

yes, you can use "os.rename" for that. ...READ MORE

answered Mar 31, 2018 in Python by DareDev
• 6,560 points
55 views
0 votes
1 answer

how can i count the items in a list?

suppose you have a list a = [0,1,2,3,4,5,6,7,8,9,10] now ...READ MORE

answered May 2 in Python by Mohammad
• 1,400 points
25 views
+4 votes
6 answers
0 votes
1 answer

Modify int in place

Use a list rather than a tuple: my_container ...READ MORE

answered Sep 7, 2018 in Python by Priyaj
• 56,120 points
16 views
0 votes
1 answer

What is the meaning of “int(a[::-1])” in Python?

Assumming a is a string. The Slice ...READ MORE

answered Aug 27, 2018 in Python by Priyaj
• 56,120 points
49 views

© 2018 Brain4ce Education Solutions Pvt. Ltd. All rights Reserved.
"PMP®","PMI®", "PMI-ACP®" and "PMBOK®" are registered marks of the Project Management Institute, Inc. MongoDB®, Mongo and the leaf logo are the registered trademarks of MongoDB, Inc.