python strings vs enum以及它们在内存级别的表示方式

时间:2013-09-02 18:04:13

标签: python

zoo.py
from main import animal

def getAnimal(animal)
    1) if animal == animal.tiger:
    or
    2) if animal == "animal"     

main.py
import Zoo        
Class animal
    tiger = "tiger"
    bear  = "bear"

1) get = Zoo.getAnimal(animal.tiger)
or
2) get = Zoo.getAnimal("tiger"):

以上是非常基本的例子,但执行上述代码的“最佳”惯例是什么?

我被告知最好通过1)方法来实现,因为“由于python如何使用指针而发生了奇怪的事情。”

执行上述代码时,内存级别会发生什么?

如果我没记错的话,每个内存地址为字符串的conseq分配的内存地址获取char的ascii值?

当字符串现在被引用为animal.tiger的对象时,它是否相同?

或者根本没有差异?

1 个答案:

答案 0 :(得分:2)

如果编译器没有优化代码(即它比你的例子更复杂),#2将用另一个指针分配一个匿名字符串。

但是,由于==进行字符串比较,即使它是两个不同的字符串(在内存中)也会有效。

在您的示例中,编译器很可能将代码优化为相同:

>>> class animal:
...  tiger = "tiger"
...  bear = "bear"
...
>>> animal.tiger
'tiger'
>>> id(animal.tiger)
140052399801616
>>> id('tiger')
140052399801616
>>>

编辑:添加了字符串内存位置不同的用户输入示例:

>>> id(animal.tiger)
140052399801616
>>> a=raw_input()
tiger
>>> id(a)
140052399801664
>>> a==animal.tiger
True
>>> a is animal.tiger
False

(使用is比较内存中的对象,如上所述)