python中具有相同值的两个不同字符串对象

2024-04-27 00:42:38 发布

您现在位置:Python中文网/ 问答频道 /正文

让我有一个字符串对象a="ABC"。现在我想创建一个不同的对象b="ABC",它将id(a)id(b)分开。在python中可能吗


Tags: 对象字符串idabc
3条回答

这是一个实现细节。如果两个变量引用同一个对象(a is b为真),则它们必须相等(a == b应为真)。但至少对于不可变对象,Python没有指定它的功能

标准CPython实现对小整数使用公共ID:

a = 1
b = 1
a is b   # True

其基本原理是,它们可能在同一程序中的多个位置使用,共享一个公共变量可以节省一些内存

当解释器可以很容易地猜测它们将共享相同的值时,也可以这样做。Python3.6上的示例

a = "abc"
b = 'ab' + 'c'
c = ''.join((chr(i) for i in range(65, 68)))
a is b      # gives True
a is c      # gives False

TL/DR:两个equal字符串是否共享相同的id是一个实现细节,不应依赖于此

This是字符串id的重要来源:

>>> a = 'python'
>>> id(a)
4400931648
>>> b = a.encode().decode()
>>> b
'python'
>>> id(b)
4400931984
>>> print('Eureka!')
Eureka!

或:

>>> a = 'python'
>>> b = (a + '.')[:-1]
>>> id(a)
4400931648
>>> id(b)
4400931760
>>> print('Eureka!')
Eureka!

但总的结论是,即使可能,你也不应该使用它

Python id()返回作为该对象标识的整数

简言之,回答问题:

尝试通过切片创建字符串“ABC”

>>> a = "ABC"
>>> id(a)
4427474416
>>> b = "ABC"
>>> id(b)
4427474416
>>> b = a[:2]+a[2:]
>>> b
'ABC'
>>> id(b)
4429072688

请详细解释

Python 3.7

>>> a = 5
>>> id(a) 
4425034672
>>> b = 5
>>> id(b)
4425034672

实际上,在python中,不可变对象(字符串、整数、元组)存储在缓存中,当我们调用id()函数时,它会返回它们的位置

因此,对于不可变对象,它返回的id与在python中缓存它们的大部分时间相同,如上所述

对于相同的可变对象,id()返回不同的值

考虑这个例子:

>>> d = { 'a' : 1 }
>>> id(d)
4426697136
>>> p = { 'a' : 1 }
>>> id(p)
4427492000

注意:

它可能不会为相同的不可变对象返回相同的标识值,因为它们可能/可能不会被缓存

相关问题 更多 >