将字符串传递给Cython函数

时间:2016-05-24 16:00:42

标签: python string cython

过去几天我一直在尝试Cython,我对c / cython处理字符串作为字符数组/指针的方式有一个简单的问题:

def function(char *string):
    for i in xrange(len(string)):
        print string[i]
        print &string[i]

现在举例来说,当我编译并运行代码时,以"abc"为参数,我得到以下答案:

  

97

     

ABC

     

98

     

BC

     

99

     

C

现在我的问题是:

  • 为什么cython会打印string[i]中每个字符的ascii值?
  • 为什么cython会在i的索引&string[i]处打印出字符串的后缀?

非常感谢。

1 个答案:

答案 0 :(得分:1)

与Python 3 bytes类似,当您在Cython中对char *进行索引时,Cython treats the char at that index as a numeric value, not text。这就是print string[i]打印数字的原因。

print &string[i]的行为是从C继承的。如果char *指向以下以空字符结尾的字符串:

 |
 v
+-+-+-+-+
|a|b|c| |
+-+-+-+-+

然后&string[1]char *,指向此处:

   |
   v
+-+-+-+-+
|a|b|c| |
+-+-+-+-+

也是以空字符结尾的字符串,其中包含字符bc。当你print时,Cython会打印bc

Cython docs建议不要使用char * s:

  

一般来说:除非你知道自己在做什么,否则请尽量避免使用C字符串,而应使用Python字符串对象。