- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解字符串在 Python 中的工作原理,但在破译各种功能方面遇到了困难。这是我的理解。希望得到关于如何记住这些细微差别的更正和新观点。
首先,我知道 Unicode 的发展是为了适应世界各地的多种语言和口音。但是python是如何存储字符串的呢?如果我定义 s = 'hello'
字符串 s
的编码是什么被储存了?是统一码吗?或者它以普通字节存储?关于做type(s)
我得到的答案是 <type 'str'>
。然而,当我这样做时us = unicode(s)
, us
属于 <type 'unicode'>
类型。是us
一个str
输入或者实际上是否有 unicode
输入Python?
此外,我知道为了存储空间,我知道我们使用 encode()
将字符串编码为字节。功能。所以假设bs = s.encode('utf-8', errors='ignore')
将返回一个字节对象。所以,现在当我写bs
时到一个文件,我应该打开 wb
中的文件吗?模式?我看到如果在 w
打开模式,它将文件中的字符串存储为 b"<content in s>"
。
decode() 函数是做什么的?(我知道,这个问题太开放了。)是不是,我们将其应用于 bytes 对象,并将字符串转换为我们选择的编码?或者它总是将其转换回 Unicode 序列?从以下几行中可以得出任何其他见解吗?
>>> s = 'hello'
>>> bobj = bytes(s, 'utf-8')
>>> bobj
'hello'
>>> type(bobj)
<type 'str'>
>>> bobj.decode('ascii')
u'hello'
>>> us = bobj.decode('ascii')
>>> type(us)
<type 'str'>
str(object)
怎么样?工作?我读到它将尝试执行对象描述中的 str() 函数。但是这个函数对 Unicode 字符串和常规字节编码字符串的作用有何不同?提前致谢。
最佳答案
重要:下面描述了 python3 行为。虽然 python2 在概念上有一些相似之处,但公开的行为会有所不同。
简而言之:由于python3中支持unicode,字符串对象是更高级别的抽象。如何在内存中表示它取决于解释器。因此,当涉及到序列化(例如,将字符串的文本表示形式写入文件)时,需要首先使用指定的编码(例如 UTF-8)将其显式编码为字节序列。字节到字符串的转换(即解码)也是如此。在 python2 中,使用 unicode
类可以实现相同的行为,而 str
是 bytes
的同义词。
虽然这不是您问题的直接答案,但请看一下这些示例:
import sys
e = ''
print(len(e)) # 0
print(sys.getsizeof(e)) # 49
a = 'hello'
print(len(a)) # 5
print(sys.getsizeof(a)) # 54
u = 'hello平仮名'
print(len(u)) # 8
print(sys.getsizeof(u)) # 90
print(len(u[1:])) # 7
print(sys.getsizeof(u[1:])) # 88
print(len(u[:-1])) # 7
print(sys.getsizeof(u[:-1])) # 88
print(len(u[:-2])) # 6
print(sys.getsizeof(u[:-2])) # 86
print(len(u[:-3])) # 5
print(sys.getsizeof(u[:-3])) # 54
print(len(u[:-4])) # 4
print(sys.getsizeof(u[:-4])) # 53
j = 'hello😋😋😋'
print(len(j)) # 8
print(sys.getsizeof(j)) # 108
print(len(j[:-1])) # 7
print(sys.getsizeof(j[:-1])) # 104
print(len(j[:-2])) # 6
print(sys.getsizeof(j[:-2])) # 100
字符串在 Python 中是不可变的,这使解释器能够在创建阶段决定字符串的编码方式。让我们回顾一下上面的数字:
u
和 u[1:]
的区别以及 u
和 u[: -1]
是 90 - 88 = 2 字节
。 IE。每个符号使用 2 个字节进行编码。即使字符串的前缀可以用每个符号 1 个字节进行编码。这为我们提供了对字符串进行恒定时间索引操作的巨大优势,但我们付出了额外的内存开销。j
的内存占用甚至更高。只是因为我们无法使用每个符号 2 个字节对其中的所有符号进行编码,因此解释器现在每个符号使用 4 个字节。好的,继续检查行为。我们已经知道,解释器以每个符号偶数个字节的方式存储字符串,以便我们通过索引进行 O(1)
访问。然而,我们也知道 UTF-8
使用符号的可变长度表示。让我们来证明一下:
j = 'hello😋😋😋'
b = j.encode('utf8') # b'hello\xf0\x9f\x98\x8b\xf0\x9f\x98\x8b\xf0\x9f\x98\x8b'
print(len(b)) # 17
因此,我们可以看到,前 5 个字符使用每个符号 1 个字节进行编码,而其余 3 个符号使用每个符号 (17 - 5)/3 = 4
字节进行编码。这也解释了为什么 python 在底层使用每个符号 4 个字节的表示形式。
另一种方式是,当我们有一个字节序列并将其解码
为字符串时,解释器将决定内部字符串表示形式(每个符号 1、2 或 4 个字节)并它对程序员来说是完全不透明的。唯一必须透明的是字节序列的编码。我们必须告诉解释器如何处理字节。而我们应该让他决定字符串对象的内部表示。
关于Python - 关于 Python 中字符串如何存储和处理的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55312480/
我真的很困惑。我已经尝试使用带有 tomcat 的 Jax-rs 并使用所有注释,我能够使用 url 调用我的服务。因此,如果没有 Jax-rs,我可以简单地拥有一个 servlet 并调用我的服务。
是否有任何工具/商业混淆器可以混淆 WPF 控件中的 BAML 资源? 如果没有,就 IP 保护而言,这是一段艰难的时期,因为黑客可以通过使用 BAML 到 XAML 转换器轻松查看 BAML 资源。
嘿大家。我在尝试使用 COBOL 在 zOS 环境中解决的编码项目中遇到了一些麻烦。我需要读入一个文件并将它们放入索引表中(我知道将少于 90 条记录)。 让我感到困扰的是,我们受到项目参数的约束,以
我试图按照这个例子来理解 join() 方法: class PrintDemo { public void printCount() { try { for(int
当我编译我正在编写的代码,然后在 JD Gui 中查看时,方法显示带有如下标题: public void growSurface(Random paramRandom, int paramInt1,
我正在为重新分发准备 Android 库,它的代码必须进行混淆处理。我已经阅读了有关此主题的一些内容,并且决定使用 Android Library Project。它将作为 jar 分发(自动在/bi
两个混淆相关的问题: 1) 是否有任何工具可以将 F# 从 MSIL 目标形式反汇编回其源形式或接近它的形式?这不是通过默默无闻来实现安全性的尝试,但我想保护某些源代码免遭“盗窃”。 2) 我简要地查
谁能向我解释为什么 simulatedCase <- rbinom(100,1,0.5) simDf <- data.frame(CASE = simulatedCase) posterior_m0
我一直无法找到关于使用 AppDomains 时发生的事情的非常清楚的描述,所以希望有人能够启发我。我有一个简单的测试程序(基本上是扯掉了 MSDN example ): using System;
假设我有 2 个分支topic和 master如果我在 topic分支,然后运行 git rebase master它是 rebase master 还是 rebase 主题分支? 做 git r
我有一个类(class): public class LockTest { public void LockThis() { lock (this)
我正在尝试最小化/混淆我的 Angular 代码,但遇到了问题。我在这里阅读“缩小说明”http://docs.angularjs.org/tutorial/step_05但我定义我的 Control
我遇到了一些困惑的操作。 var a = 0.1; var b = 0.2; var c = 0.3; console.log(a); // 0.1 console.log(b); // 0.2 co
感谢您查看我的帖子 - 我正在尝试弄清楚如何在单击链接时关闭此下拉菜单,但我的 JavaScript 技能非常缺乏,而且代码似乎很困惑。这是 HTML:
混淆、哈希和加密之间有什么区别? 这是我的理解: 哈希是一种单向算法;无法逆转 混淆与加密类似,但不需要任何“ secret ”即可理解(ROT13 就是一个例子) 加密是可逆的,但需要“ secre
我有以下代码 my $content = $response->content; $content =~ /username=([\s\S]+?)&/; my $username = $1; prin
我在 .NET 中发现了一些与我预期的有点不同的东西。我粘贴的代码没有意义,但它是我拥有的一个复杂得多的函数的浓缩版。我实际上是在获取匿名类型信息作为参数(尚未创建匿名类型的实例),我需要创建该类型的
我正在努力解决 JavaFX 应用程序的混淆问题。使用此项目作为基础: https://github.com/openjfx/samples/tree/master/IDE/IntelliJ/Non-
是否可以制作一个与此类似的 CSV 阅读器 while((line = reader.readLine()) != null){ String[] values = line.
公共(public)类测试2 { 公共(public)静态无效主(字符串[]参数){ System.out.println("3 + 6"); System.out.println(3
我是一名优秀的程序员,十分优秀!