这更像是一种好奇
假设我有以下代码
>>> 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的包装类?在
编辑: 我没有一个特定的软件,必须遵守这一点。这更像是一个思考练习为什么会这样。我想我的三个问题是:
为什么int
s是不可变的?(仍不确定)
有没有办法强迫它们变为可变的?(维姆的回答)
有没有一种很好的方法来强制它们是可变的(比如Java中的Integer
vsint
)-我认为答案是否定的?
非常感谢您的讨论!在
使用列表而不是元组:
tuple
是不可变的-您不能修改它们。在int
是不可变的-您不能修改它们。在最接近的方法是使用ctypes对值进行monkeypatch。但这并不是“好”的,如果有任何事情碰巧使用了这个整数,您可能会中断Python运行时。在
^{pr2}$下面是小整数的情况:
注意,只有一个
^{pr2}$2
对象。不过,让我们来看看不小的整数:Python运行时系统仍然为第一个元素创建一个新的integer对象。
314160
存在于两个地方。这是缓存小整数,而不是im/mutable对象实现的任何属性。在相关问题 更多 >
编程相关推荐