3

在 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 中有什么方法可以做同样的事情吗?

4

1 回答 1

2

你不应该那样做。主要原因是 PyPy 有一个可移动的垃圾收集器,所以指向它的内容的指针可能会突然开始指向垃圾。另一个原因是我们很少有具有类似 StringAdd(a, b) 结构的选项,其中实际上没有可引用的底层 char*。这些优化默认情况下不启用,但它们可能很快就会启用。

于 2012-09-14T17:23:31.837 回答