python 中字符串默认的是 Unicode 编码,数字字符、英文字符和中文字符在 Unicode 编码中不是都是 2 字节么?
为什么我用 getsizeof()函数来看字符串的内存大小,发现 1 个汉字字符是 2 字节没错,但 1 个数字字符却只有 1 字节?
我用 utf-8 编码检验了一下,没发现问题。1 个数字字符 1 字节,一个汉字 3 字节。
print('Unicode_123 =', sys.getsizeof('123'))
print('Unicode_12 =', sys.getsizeof('12'))
# Unicode_123-Unicode_12 可得字符串默认编码下 1 个数字字符所占内存
print('Unicode_一二三 =', sys.getsizeof('一二三'))
print('Unicode_一二 =', sys.getsizeof('一二'))
# Unicode_一二三-Unicode_一二可得字符串默认编码下 1 个汉字字符所占内存
print('Utf-8_123 =', sys.getsizeof('123'.encode('utf-8')))
print('Utf-8_12 =', sys.getsizeof('12'.encode('utf-8')))
# Utf-8_123-Utf-8_12 可得 utf-8 编码下 1 个数字字符所占内存
print('Utf-8_一二三 =', sys.getsizeof('一二三'.encode('utf-8')))
print('Utf-8_一二 =', sys.getsizeof('一二'.encode('utf-8')))
# Utf-8_一二三-Utf-8_一二可得 utf-8 编码下 1 个汉字字符所占内存
显示结果如下:
Unicode_123 = 52
Unicode_12 = 51
Unicode_一二三 = 80
Unicode_一二 = 78
Utf-8_123 = 36
Utf-8_12 = 35
Utf-8_一二三 = 42
Utf-8_一二 = 39
但如果字符串是数字或英文字母混合汉字时,新增 1 个数字字符是增加 2 字节
print('Unicode_一 =', sys.getsizeof('一'))
print('Unicode_1 一 =', sys.getsizeof('1 一'))
print('Unicode_a 一 =', sys.getsizeof('a 一'))
print('Unicode_一二 =', sys.getsizeof('一二'))
显示结果如下:
Unicode_一 = 76
Unicode_1 一 = 78
Unicode_a 一 = 78
Unicode_一二 = 78
这种情况是为什么呢?