在p中修改int

2024-05-20 05:10:16 发布

您现在位置:Python中文网/ 问答频道 /正文

这更像是一种好奇

假设我有以下代码

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

TypeError: 'tuple' object does not support item assignment

这是意料之中的,因为与C不同,Python不修改底层int,而是创建一个新的int(在下面的代码中观察到)

^{pr2}$

如果我想修改元组中的底层整数,我可以像

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

我的问题是:有没有更好的方法来做这件事(最好是性能好,最好已经在标准库中了)?可能是int的包装类?在

编辑: 我没有一个特定的软件,必须遵守这一点。这更像是一个思考练习为什么会这样。我想我的三个问题是:

  • 为什么ints是不可变的?(仍不确定)

  • 有没有办法强迫它们变为可变的?(维姆的回答)

  • 有没有一种很好的方法来强制它们是可变的(比如Java中的Integervsint)-我认为答案是否定的?

非常感谢您的讨论!在


Tags: 方法代码supportobjectmynotitemimmutable
2条回答

使用列表而不是元组:

my_container = [1, 2]

tuple是不可变的-您不能修改它们。在

int是不可变的-您不能修改它们。在

最接近的方法是使用ctypes对值进行monkeypatch。但这并不是“好”的,如果有任何事情碰巧使用了这个整数,您可能会中断Python运行时。在

^{pr2}$

下面是小整数的情况:

>>> hacked_immutable = ([1], [2])
>>> hacked_immutable
([1], [2])
>>> id(hacked_immutable)
139813228968072
>>> id(hacked_immutable[0])
139813228055688
>>> id(hacked_immutable[0][0])
139813227530592
>>> id(hacked_immutable[1])
139813228056008
>>> id(hacked_immutable[1][0])
139813227530624
>>> 
>>> 
>>> hacked_immutable[0][0] += 1
>>> hacked_immutable
([2], [2])
>>> id(hacked_immutable)
139813228968072
>>> id(hacked_immutable[0])
139813228055688
>>> id(hacked_immutable[0][0])
139813227530624
>>> id(hacked_immutable[1])
139813228056008
>>> id(hacked_immutable[1][0])
139813227530624

注意,只有一个2对象。不过,让我们来看看不小的整数:

^{pr2}$

Python运行时系统仍然为第一个元素创建一个新的integer对象。314160存在于两个地方。这是缓存小整数,而不是im/mutable对象实现的任何属性。在

相关问题 更多 >