两个具有相同字符的Python字符串,a == b,可以共享内存,id(a)== id(b),或者可以在内存中两次,id(a)!= id(b).尝试
ab = "ab"
print id( ab ), id( "a"+"b" )
Run Code Online (Sandbox Code Playgroud)
在这里,Python认识到新创建的"a"+"b"与已经在内存中的"ab"相同 - 不错.
现在考虑一个N长的州名列表["亚利桑那州","阿拉斯加州","阿拉斯加州","加利福尼亚州......"(在我的案例中为N~500000).
我看到50个不同的id()s⇒每个字符串"Arizona"......只存储一次,很好.
但是将列表写入磁盘并再次读回:"相同"列表现在有N个不同的id()s,内存更多,见下文.
怎么 - 任何人都可以解释Python字符串内存分配?
""" when does Python allocate new memory for identical strings ?
ab = "ab"
print id( ab ), id( "a"+"b" ) # same !
list of N names from 50 states: 50 ids, mem ~ 4N + 50S, each string once
but list > file > mem again: N ids, mem ~ N * (4 + …Run Code Online (Sandbox Code Playgroud) 该IS运算符用于测试的身份.
我想知道is运算符和id()函数是否调用任何__magic__方法,==调用方式__eq__.
我有一些乐趣退房__hash__:
class Foo(object):
def __hash__(self):
return random.randint(0, 2 ** 32)
a = Foo()
b = {}
for i in range(5000):
b[a] = i
Run Code Online (Sandbox Code Playgroud)
想想字典b和价值b[a]
每个后续查找
d[a]都是一个KeyError或一个随机整数.
[ 默认实现 ] x.
__hash__()返回id(x).
因此,有是只是周围的其他方式两者之间的关系,但.
在python中,两个代码具有不同的结果:
a = 300
b = 300
print (a==b)
print (a is b) ## print True
print ("id(a) = %d, id(b) = %d"%(id(a), id(b))) ## They have same address
Run Code Online (Sandbox Code Playgroud)
但是在外壳模式(交互模式)下:
>>> a = 300
>>> b = 300
>>> a is b
False
>>> id(a)
4501364368
>>> id(b)
4501362224
Run Code Online (Sandbox Code Playgroud)
“是”运算符具有不同的结果。