众所周知,Python3将所有字符串字符作为Unicode代码点.

type('\x0d')
<class 'str'>
type(b'\x0d')
<class 'bytes'>

The ascii of b'\x0d' is 13,stored in memory in the form of 0000 0111,'\x0d' is stored in the same format of 0000 0111 or not?Are they equally stored in memory?
To dig more to make me more confused:

#My python version
python3 --version
Python 3.9.2
#in python cli
len(b'\x0d')
1
import sys
print(sys.getsizeof(b'\x0d'))
34

b\x0d不是以00000111的形式存储在内存中吗?

print(sys.getsizeof('\x0d'))
50

使用sys.getsizeof让我明白了:

  1. stringbytes与不同的对象一起存储在python3中.
  2. 当我们说b\x0d是以00000111的形式存储在内存中时,它是基于某种抽象级别的,实际上b\x0d是以34个字节存储在PC的内存中用于cython3?

推荐答案

如果您感兴趣,可以查看CPython中每个对象的内存内容.对象的大小可以通过sys.getsizeof(obj)查询,而内存地址恰好是当前实现中对象的id(obj).ctypes模块具有string_at功能,该功能采用存储器地址和大小来读取存储器:

>>> import sys
>>> import ctypes
>>> x = '\x0d'
>>> ctypes.string_at(id(x), sys.getsizeof(x)).hex()
'02ca9a3b0000000070a427b3fb7f00000100000000000000c879dc5ef7a24b87e40000000000000000000000000000000d00'
>>> x = b'\x0d'
>>> ctypes.string_at(id(x), sys.getsizeof(x)).hex()
'01ca9a3b00000000b0b126b3fb7f00000100000000000000c879dc5ef7a24b870d00'

上面您可以看到对象具有不同的内存映像,但至少在本例中,对象中的数据存储在最后一个字节0d 00中,并且由于CPython使用latin-1 8位编码来存储Unicode字符串(有关详细信息,请参阅PEP 393),因此对象中的数据是相同的.CPython添加了一个空终止符作为另一个实现细节.其他字节表示CPythonPyBytesPyUnicode对象的实现中的数据.

Python-3.x相关问答推荐

使用Pandas 阅读Excel定义的名称和单元格值(&Q;)

将Trio与基于线程的事件侦听器混合使用

如何从选定的html内容中获取所需的文本

从PYTHON中获取单行和多行的Rguar表达式

使用Python抓取sofascore以获取有关球队阵容和投票的信息

selenium 无法执行网站上最简单的功能

公开数据中的卫星图像网页抓取优化

当参数名称与 typing.Protocol 中定义的名称不同时发生 mypy 错误

如何在 Telethon 中向机器人发送发送表情符号

使用 selenium 加速网页抓取

有没有办法使用重采样矢量化添加缺失的月份?

如何在 on_ready 事件中使用 change_presence? (discord.py)

避免重复连续字符但不包括一个特定字符的正则表达式

FastAPI - 调用 API 时设置 response_model_exclude

python asyncio - 如何等待取消的屏蔽任务?

迭代器也是可迭代的吗?

如何在 jupyter notebook 5 中逐行分析 python 3.5 代码

混合全局/参数和名为top的函数的奇怪python行为

计数大于Pandas groupby 中的值的项目

在 macbook pro M1 上安装 Tensorflow 时出现zsh:非法硬件指令 python