在CPython中,这有效:
import ctypes
ctypes.pythonapi.PyString_AsString.argtypes = (ctypes.c_void_p,)
ctypes.pythonapi.PyString_AsString.restype = ctypes.POINTER(ctypes.c_char)
s = "abc"
cs = ctypes.pythonapi.PyString_AsString(id(s))
cs[0] = "x"
print s # will print 'xbc'
在PyPy中,它并不是因为我无法以这种方式访问C-API。
有没有办法在PyPy中做同样的事情?
答案 0 :(得分:2)
你不应该这样做。主要原因是PyPy有一个可移动的垃圾收集器,因此指向它内容的指针可能突然开始指向垃圾。另一个原因是我们有几个选项具有StringAdd(a,b)结构,其中实际上没有底层char *可供引用。默认情况下,这些优化不会启用,但它们很快就会启用。