如何以非常规方式修改Python元组中的底层整数?
嘿,这事儿挺有意思的——纯技术探索的角度来唠唠Python元组的不可变性,以及怎么“钻空子”修改元组里的整数!
先聊聊常规情况:元组为啥不能直接改
咱们先看这段代码,完全符合预期:
>>> my_immutable = (1, 2) >>> my_immutable[0] += 1 TypeError: 'tuple' object does not support item assignment
这是因为Python里的元组本身是不可变容器,而里面的int对象也是不可变类型——和C语言直接修改内存里的数值不同,Python执行x += 1的时候,根本不会修改原来的int对象,而是创建一个全新的int实例,咱们用id()就能验证:
>>> x = 1 >>> id(x) 33156200 >>> x += 1 >>> id(x) 33156176
看到没?x已经指向了一个新的内存地址,原来的1还在内存里,只是x不再引用它了。而元组不允许你把新的int对象替换掉原来的位置,所以直接赋值会报错。
非常规操作:硬改元组里的整数
那要是非得修改元组里的底层整数呢?确实有一些“野路子”,比如直接调用Python的C API来绕过元组的不可变性限制。举个用ctypes实现的例子:
import ctypes # 先定义元组 my_tuple = (1, 2) # 调用Python的C API函数PyTuple_SetItem ctypes.pythonapi.PyTuple_SetItem.argtypes = [ctypes.py_object, ctypes.c_ssize_t, ctypes.py_object] ctypes.pythonapi.PyTuple_SetItem(my_tuple, 0, 3) print(my_tuple) # 输出 (3, 2)
不过得严肃提醒一句:这种操作极度危险!Python的很多机制都依赖元组的不可变性(比如用元组当字典的键、缓存哈希值等),强行修改会打破内存安全,导致各种不可预测的bug,生产环境绝对不能用,纯当技术玩玩就行。
内容的提问来源于stack exchange,提问作者Andrei Cioara
相关产品推荐
相关产品推荐

