分享

python打印内存的值

 文炳春秋 2020-03-14

字符串和字符串编码是两个不同的概念,python作为一门优秀的编程语言中是做了严格的区分,即使用不同的class来表示,同时存储的内容也是不一样的。尽管在python2中区分的还不是特别的明显,但是在python3中是明确的使用str类表示字符串;bytes表示字节串,即可以用来存储字符串编码后的值,说明如下:

首先字符集和字符编码在ASCII,GB2312,GBK中往往混淆这两个概念,因为他们即是字符集也是字符编码,这是编码早期阶段遗留的问题;但是unicode字符集的庞大,使得其产生了诸多编码方式,包括utf8,utf16,utf32等多种编码方式,因此在unicode中需要明确字符集和编码的不同。通常来说,unicode指的是字符集,对应字符的编号;utf8指的是unicode对应的编码。关于utf8编码规则,我在这篇文中有详细的介绍;关于unicode的应用,我在这里有介绍,可以自行查看。

1,Python3中使用str类来表示和存储字符串,在一个具体的字符串对象中存储的内容是每个字符的编号,该编号就是字符集中赋予的。至于该编号使用几个字节来进行存储往往是不确定的,例如常用汉字的编号通常使用两个字节就可以表示编号。对于一些特殊的字符(比如音乐中的那些字符),往往需要更多的字节。这是python 内部的实现机制,不在过多的阐述,感兴趣的同学在学习完本文方法文后,自行研究尝试。

2,Python3中使用bytes类来表示和存储字符串的编码。由于unicode字符集对应的编码方式不止一个,包括utf8,ut16,utf32等等,python通常默认时使用utf8编码方式。因此不同的编码方式下,得到字符串的编码值:1,首先互不相同;2,其次编码之后bytes对象中存储的值和str对象中存储的值也是不一样的。

以我的CSDN博客名称 村中少年这几个字符串为例:
1,首先这几个字符的unicode编号分别为6751,4E2D,5C11,5E74
2,Utf8编码后的值为E6 9D 91 E4 B8 AD E5 B0 91 E5 B9 B4

编写如下程序,并查看对象对应的内存内容:

def printMem(data):
    from ctypes import string_at
    from sys import getsizeof
    from binascii import hexlify

    print(hexlify(string_at(id(data), getsizeof(data))))
if __name__ == "__main__":
    
    nameStr = '村中少年'
    nameBytes = nameStr.encode()
    print(type(nameStr))
    print(type(nameBytes))
    printMem(nameStr)
    printMem(nameBytes)

运行结果如下:
<class ‘str’>
<class ‘bytes’>
b’0500000000000000c0f562b5417f000004000000000000001a53594dc9e6e066a80a64b5417f0000000000000000000000000000000000000000000000000000000000000000000051672d4e115c745e0000’
b’0300000000000000e0fe60b5417f00000c00000000000000ffffffffffffffffe69d91e4b8ade5b091e5b9b400’

标记的部分分别表示的是字符串中的unicode编号以及utf8编码后的值,可以看到nameStr字符串中的确存储了Unicode编号的值,nameBytes存储的是编码后的值,验证了一开始所说的。

为什么要使用编号表示字符串本身呢?因为字符串,无论在何处,无论是写在纸上还是显示在计算机上,其本身的含义不变,因此需要编号这个确定的值来表示。但是在存储的时候,出于效率的考虑,有不同的编码方式,不同的编码方式意味这不同的值。因此编码值来表示字符串是不合适的,编码值只是存储层次的表示。通过我的这篇文章,相信你对于字符串和其编码方式应该能够加以区分。

本文为CSDN村中少年原创文章,转载记得加上小尾巴偶,博主链接这里

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多