这更多的是我尝试理解的Python模块中遇到的一个'有趣'现象,而不是帮助请求(虽然解决方案也是有用的)。违反CPython中的字符串不变性
>>> import fuzzy
>>> s = fuzzy.Soundex(4)
>>> a = "apple"
>>> b = a
>>> sdx_a = s(a)
>>> sdx_a
'A140'
>>> a
'APPLE'
>>> b
'APPLE'
呀,所以fuzzy模块完全违反了Python中的不变性。它能够做到这一点,因为它是一个C扩展?这是否构成CPython和模块的错误,甚至是安全风险?
此外,任何人都可以想出一种方法来解决这种行为?我希望能够保留字符串的原始大小写。
干杯,
亚历
我没有看到生成的C中的任何地方它突变字符串。 –
@ IgnacioVazquez-Abrams:也许我错过了一些东西,但是它不会在'__call__' [[__pyx_f_5fuzzy_7Soundex ___ call__']]中变异呢?它声明了一个cdef char ptr,它将其设置为等于PyString_AsString调用的结果,然后修改其内容。 – DSM
@DSM:不在Bitbucket的代码中。我只能看到[891行](https://bitbucket.org/yougov/fuzzy/src/c210ad2f3f68/src/fuzzy.c#cl-891)的内容。 –