python字符串与enum以及它们在内存级别的表示方式

python字符串与enum以及它们在内存级别的表示方式,python,Python,及 以上是非常基本的示例,但执行上述代码的“最佳”约定是什么 有人告诉我,最好通过1)方法来实现,因为“由于python如何使用指针,会发生奇怪的事情。” 当执行上述代码时,在内存级别上发生了什么 如果我没记错的话,每个内存地址都会为conseq分配的字符串内存地址获取字符的ascii值 当字符串现在被引用为animal.tiger的对象时,它是否相同 或者根本没有区别?如果编译器没有优化代码(即,它比您的示例更复杂)#2将使用另一个指针分配匿名字符串 但是由于==进行字符串比较,即使是两个不同

以上是非常基本的示例,但执行上述代码的“最佳”约定是什么

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

当执行上述代码时,在内存级别上发生了什么

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

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


或者根本没有区别?

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

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

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

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

1) get = Zoo.getAnimal(animal.tiger)
or
2) get = Zoo.getAnimal("tiger"):
编辑:添加了字符串内存位置不同的用户输入示例:

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

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

通常,它们实际上是相同的,因为它们都是固定的内部字符串。但是,如果您从用户处获得输入,则它们将不是同一个对象。@nneonno将用户的输入作为不同的对象是什么意思?@ealeon:请参阅Qiau的编辑。基本上,动态生成的字符串通常具有与常量(内部)字符串分开的内存地址,至少在CPython(最流行的实现)中是这样?
>>> 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