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

python中具有相同值的两个不同字符串对象,python,string,object,Python,String,Object,让我有一个字符串对象a=ABC。现在我想创建一个不同的对象b=ABC,将ida和idb分开。在python中可能吗?是字符串id的重要来源: >>> a = 'python' >>> id(a) 4400931648 >>> b = a.encode().decode() >>> b 'python' >>> id(b) 4400931984 >>> print('Eureka!') Eu

让我有一个字符串对象a=ABC。现在我想创建一个不同的对象b=ABC,将ida和idb分开。在python中可能吗?

是字符串id的重要来源:

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

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

是字符串id的重要来源:

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


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

这是一个实现细节。如果两个变量引用同一个对象a为真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:两个相等的字符串是否共享相同的id是一个实现细节,不应依赖于此。

这是一个实现细节。如果两个变量引用同一个对象a为真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:两个相等的字符串是否共享相同的id是一个实现细节,不应依赖于此。

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

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

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

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

考虑这个例子:

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


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

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

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

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

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

考虑这个例子:

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


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

您不应该有任何理由弄乱这一点。为什么要担心这两个字符串对象的标识呢?如果确实需要的话,b=a[0]+a[1:]。不知道它有什么用途。是的,虽然这是可能的,但不可变对象的id无论如何都不应该是您关心的问题。我想知道你想用这个做什么。我看到了你的Y,你的X是什么?@khelwood引出了同样的问题ID@Adelin当我尝试的时候,你不应该有任何理由去搞砸这件事。为什么要担心这两个字符串对象的标识呢?如果确实需要的话,b=a[0]+a[1:]。不知道它有什么用途。是的,虽然这是可能的,但不可变对象的id无论如何都不应该是您关心的问题。我想知道你想用这个做什么。我看到了你的Y,你的X是什么?@khelwood引出了同样的问题ID@Adelin当我尝试的时候就不是了。