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 には移動可能なガベージ コレクターがあるため、その内容へのポインターが突然ガベージを指し始める可能性があるためです。もう 1 つの理由は、たとえば StringAdd(a, b) のような構造を持つオプションがほとんどないためです。ここでは、参照する基になる char* は実際にはありません。これらの最適化はデフォルトではオンになっていませんが、おそらくすぐに有効になるでしょう。

于 2012-09-14T17:23:31.837 に答える