【发布时间】:2017-10-29 06:15:42
【问题描述】:
unicode 字符数组可以用作可变字符串:
import array
ins = "Aéí"
ms = array.array('u', ins)
ms[0] = "ä"
outs = ms.tounicode()
# äéí
但类型 'u' 自 Python 3.3 起已弃用。什么是现代替代品?
我能做到:
ms = list(ins)
# mutate
outs = ''.join(ms)
但我发现一个字符列表与数组相比内存效率非常低。
或者:
ms = array.array('L', (ord(ch) for ch in ins))
ms[0] = ord("ä")
outs = "".join(chr(ch) for ch in ms)
但它的可读性远不如已弃用的原版。
【问题讨论】:
-
numpy接受 Unicode 字符串,分配 4 个字节的 ped 字符,每个元素的常量n字符。有了所有这些填充,它的内存效率可能不如列表。 -
@hpaulj 每个字符 4 个字节就可以了,就像 C 语言中的 UTF-32 或 wchar_t。但是
sys.getsizeof('x')在我的 PC 上是 50,getsizeof('ä')是 74。每个列表项需要 这么多 个字节,因为列表中的每个字符实际上都是一个完整的字符串对象。 -
它已被弃用,因为 Python unicode 字符串不再是固定大小。它们的宽度取决于现在字符串中最高的 Unicode 代码点(每个代码点 1、2 或 4 个字节)。
-
为什么需要这个
array?为什么不改用bytearray对象,并将数据编码为字节? -
@MartijnPieters 我会怀念
mutable_string[position] = ch的简单性。而且“弃用”通常意味着将被更好的东西取代。我不知道那是什么新东西。
标签: python-3.x unicode