81

是否有与 Ruby 符号等效的 Python?

  • 如果是这样,那是什么?

  • 如果不是,那么我们是否只使用字符串作为字典中的键?

4

5 回答 5

79

不,python 没有符号类型。

但是,默认情况下,字符串文字是实习的,其他字符串可以使用该intern函数进行实习。因此,在字典中使用字符串文字作为键的性能不亚于在 ruby​​ 中使用符号。

于 2010-09-18T21:19:14.140 回答
20

正如其他人所说,Python 中没有符号,但字符串效果很好。

为避免将字符串引用为键,请使用 dict() 构造函数语法:

d = dict(
    a = 1,
    b = 2,
    c = "Hello there",
    )
于 2010-09-18T23:21:41.473 回答
14

同样对于那些感兴趣的人:当在哈希中使用时,Ruby 中的符号与 python 中的空对象非常相似。例如你可以这样做:

some_var = object()

然后将字典键设置为 some_var:

some_dict = { some_var : 'some value' }

然后进行标准检索:

some_dict[some_var]

但是,正如 sepp2k 指出的那样,这样做并没有性能优势。事实上,我做了一个快速测试,发现几乎没有性能提升:

a, b, c, d, e = [object() for _ in range(5)]
dict_symbols = {a : 'a', b : 'b', c : 'c', d : 'd', e : 'e'}
dict_strings = {'a' : 'a', 'b' : 'b', 'c' : 'c', 'd' : 'd', 'e' : 'e'}

def run_symbols():
    for key in dict_symbols.keys():
        dict_symbols[key]

def run_strings():
    for key in dict_strings.keys():
        dict_strings[key]

在 ipython 中测试的速度:

In [3]: %timeit run_symbols
10000000 loops, best of 3: 33.2 ns per loop

In [4]: %timeit run_strings
10000000 loops, best of 3: 28.3 ns per loop

因此,在我的情况下,“符号”运行速度较慢!(对于有趣的数字,不准确)。但是需要注意的是,这样做可能有内存优势。如果您不关心键类型对象的占用空间比字符串小。

import sys
sys.getsizeof('some_var') # 45
some_var = object() 
sys.getsizeof(some_var) # 0

尽管这引发了 python 如何处理变量名 some_var 的内存的问题。

于 2014-04-22T06:43:40.797 回答
7
  1. 不,没有等价物。
  2. 不,您可以将每个可散列对象用作字典键。
于 2010-09-18T21:18:38.587 回答
4

不是一流的类型,但确实存在https://pypi.python.org/pypi/SymbolType

于 2013-07-20T22:11:04.267 回答