@CodeSurgeon 链接的这个答案有可能做到这一点。然而,从 Cython 0.28 开始,我们有了一种更简洁的方式 - 类型化的只读内存视图:
%%cython
mv = memoryview(b'1234')
cdef const unsigned char[:] tmv=mv #"const" is possible since Cython 0.28
显然,您只能从此内存视图中读取(这是一件好事),并且不涉及复制。
你也可以说:但这是unsigned char
和不是char
!bytes
是的——这也是一件好事:unsigned char
s 和类型化的内存视图的全部意义在于你没有混淆类型!
我认为链接解决方案有点危险的另一个原因 - 你拥有 C 的全部力量来击中自己的脚,因为它抛弃了类型和 constness。参见例如:
%%cython
def bad_things(a):
cdef const unsigned char[:] safe=a
cdef char *unsafe=<char *> &safe[0] #who needs const and types anyway?
unsafe[0]=52 #replace through `4`
现在:
>>> A=b'a'
>>> bad_things(A)
>>> print(A) #take it Python - I pwned your immutability!
b'4'
>>> print(b'a')
b'4'
>>> #Help! What are you doing Python?
因为 Python 有一个小字符串池,它们是不可变的(或者 Python 认为),并且我们已经更改了b'a'
链接到的对象,b'4'
我们应该为有趣的结果和愉快的调试做好准备......
总的来说,这很简单:坚持类型化的内存视图,它保证类型和常量安全。