【发布时间】:2018-03-25 06:49:36
【问题描述】:
我有一个 unicode 字符串 f。我想将它设置为 0。 print f 应该显示 null (\0)
我正在使用 ctypes.memset 来实现这一点 -
> >>> f
> u'abc'
> >>> print ("%s" % type(f))
> <type 'unicode'>
> >>> import ctypes
> **>>> ctypes.memset(id(f)+50,0,6)**
> **4363962530
> >>> f
> u'abc'
> >>> print f
> abc**
为什么在unicode字符串的情况下内存位置没有得到memset? 它非常适合 str 对象。
感谢您的帮助。
【问题讨论】:
-
PyUnicode_Object与PyString_Object的内部格式不同,因此没有理由期望相同的偏移量会找到两者的缓冲区。 -
另外,这应该是不言而喻的,但是……这对于任何目的来说都是一个非常糟糕的主意,除了探索 CPython 的实现。解释器期望字符串是不可变的,如果你违反它,各种事情都会破坏。
-
你从哪里知道这意味着缓冲区的偏移量是 50?
-
不,字符串类型的偏移量是 36,而不是 37。(这仅在 64 位 Python 上有效,并且仅在大多数而非所有 64 位平台上有效)。这不是您可以应用于任何类型的神奇规则;您必须通过查看 C 结构的定义方式并了解平台的 C 布局规则来弄清楚这一点。
-
我已经写了一个答案来解释如何做到这一点 - 但真的,真的,真的不要这样做。
标签: python python-2.7 unicode python-unicode unicode-string