是否有Python等效的Ruby符号?

67 ruby python dictionary symbols language-comparisons

是否有Python等效的Ruby符号?

  • 如果是的话那么它是什么?

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

sep*_*p2k 71

不,python没有符号类型.

但是,默认情况下会对字符串文字进行实习,并且可以使用该intern函数实现其他字符串的实现.因此,使用字符串文字作为字典中的键并不比使用ruby中的符号具有更高的性能.

  • +1.对于我们Ruby开发人员来说幸运的是,性能不是一个字.(对不起,我们只是语义!):D (19认同)
  • @delnan,当然有一种解决方法:dict(a = 1,b = 2,c = 3). (11认同)
  • 这样做的主要好处是该语言具有较少的核心语法和内置类型.当它可以透明地完成时,它在语言中是不必要的复杂性. (10认同)
  • @Glenn 起初,当我听说 Python 没有符号并且字符串文字可以用作键时,我感到很沮丧。问题是我对必须在所有键周围加上引号这一事实感到不满意。有没有解决的办法? (2认同)

Ned*_*der 17

正如其他人所说,Python中没有符号,但字符串运行良好.

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

d = dict(
    a = 1,
    b = 2,
    c = "Hello there",
    )
Run Code Online (Sandbox Code Playgroud)

  • 具有讽刺意味的是,这个解决方案确实(至少在最初)限制您使用字符串作为键。 (2认同)

小智 11

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

some_var = object()
Run Code Online (Sandbox Code Playgroud)

然后将字典键设置为some_var:

some_dict = { some_var : 'some value' }
Run Code Online (Sandbox Code Playgroud)

然后进行标准检索:

some_dict[some_var]
Run Code Online (Sandbox Code Playgroud)

但是,正如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]
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

所以在我的情况下,'符号'运行得更慢!(对于有趣的数字,不准确).但是要注意,这样做可能有记忆优势.如果您不关心键类型对象的占用空间小于字符串.

import sys
sys.getsizeof('some_var') # 45
some_var = object() 
sys.getsizeof(some_var) # 0
Run Code Online (Sandbox Code Playgroud)

虽然这引发了python如何处理变量名some_var的内存的问题.


Phi*_*ipp 7

  1. 不,没有相应的.
  2. 不,您可以将每个可清除对象用作字典键.