- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
>> b = "poi" >>> a is b True 代码-6ren">
is
运算符比较两个对象的内存地址,如果相同则返回True
。那么,为什么它不能可靠地处理字符串呢?代码#1
>>> a = "poi"
>>> b = "poi"
>>> a is b
True
代码#2
>>> ktr = "today is a fine day"
>>> ptr = "today is a fine day"
>>> ktr is ptr
False
我创建了两个内容相同的字符串,但它们位于不同的内存地址上。为什么 is
运算符的输出不一致?
最佳答案
我相信这与string interning.有关本质上,这个想法是只存储每个不同字符串的单个副本,以提高某些操作的性能。
基本上,a is b
起作用的原因是(正如您可能已经猜到的那样)在这两种情况下,Python 都会引用一个不可变的字符串。当字符串很大时(以及我最有可能不理解的其他一些因素),这不会完成,这就是为什么你的第二个示例返回 False。
编辑:事实上,奇怪的行为似乎是交互环境的副作用。如果您将相同的代码放入 Python 脚本中,a is b
和 ktr is ptr
都会返回 True。
a="poi"
b="poi"
print a is b # Prints 'True'
ktr = "today is a fine day"
ptr = "today is a fine day"
print ktr is ptr # Prints 'True'
这是有道理的,因为 Python 可以很容易地解析源文件并在其中查找重复的字符串文字。如果动态创建字符串,那么即使在脚本中它的行为也会有所不同。
a="p" + "oi"
b="po" + "i"
print a is b # Oddly enough, prints 'True'
ktr = "today is" + " a fine day"
ptr = "today is a f" + "ine day"
print ktr is ptr # Prints 'False'
至于为什么a is b
仍然结果为True,也许分配的字符串足够小,足以保证快速搜索interned集合,而另一个则不然?
关于python - 对 `is` 运算符与字符串感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55383410/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!