2024-04-27 00:42:38 发布
网友
让我有一个字符串对象a="ABC"。现在我想创建一个不同的对象b="ABC",它将id(a)和id(b)分开。在python中可能吗
a="ABC"
b="ABC"
id(a)
id(b)
这是一个实现细节。如果两个变量引用同一个对象(a is b为真),则它们必须相等(a == b应为真)。但至少对于不可变对象,Python没有指定它的功能
a is b
a == b
标准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
注意:
它可能不会为相同的不可变对象返回相同的标识值,因为它们可能/可能不会被缓存
这是一个实现细节。如果两个变量引用同一个对象(
a is b
为真),则它们必须相等(a == b
应为真)。但至少对于不可变对象,Python没有指定它的功能标准CPython实现对小整数使用公共ID:
其基本原理是,它们可能在同一程序中的多个位置使用,共享一个公共变量可以节省一些内存
当解释器可以很容易地猜测它们将共享相同的值时,也可以这样做。Python3.6上的示例
TL/DR:两个equal字符串是否共享相同的id是一个实现细节,不应依赖于此
This是字符串id的重要来源:
或:
但总的结论是,即使可能,你也不应该使用它
Python id()返回作为该对象标识的整数
简言之,回答问题:
尝试通过切片创建字符串“ABC”
请详细解释
Python 3.7
实际上,在python中,不可变对象(字符串、整数、元组)存储在缓存中,当我们调用id()函数时,它会返回它们的位置
因此,对于不可变对象,它返回的id与在python中缓存它们的大部分时间相同,如上所述
对于相同的可变对象,id()返回不同的值
考虑这个例子:
注意:
它可能不会为相同的不可变对象返回相同的标识值,因为它们可能/可能不会被缓存
相关问题 更多 >
编程相关推荐