相关疑难解决方法(0)

Python何时为相同的字符串分配新内存?

两个具有相同字符的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)

python memory memory-management

39
推荐指数
3
解决办法
7324
查看次数

`is`运算符在Python中使用__magic__方法吗?

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).

因此,有只是周围的其他方式两者之间的关系,但.

我见过很多问题isid在此处,将答案已经帮助许多糊涂思想,但我无法找到答案,这一个.

python operators

13
推荐指数
2
解决办法
741
查看次数

为什么`is`运算符在脚本中的行为与REPL不同?

在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)

“是”运算符具有不同的结果。

python cpython

4
推荐指数
2
解决办法
130
查看次数

标签 统计

python ×3

cpython ×1

memory ×1

memory-management ×1

operators ×1