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


76

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

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

  • 如果不是这样,我们是否只在字典中使用字符串作为


4
在下面对这个答案的评论中进行跟进:如果您想要可以在其中键入d.b而不是的内容d['b'],则可以使用一个空class D(object): pass的实例d = D()来创建实例,然后您可以将其值分配给组成的属性,例如d.a=1andd.b=2和of当然会得到这样的价值print(d.a + d.b)。不知道这是否会比d['b']答案中的普通字典查找慢。
FriendFX

另外,如果你想有一个独特的恒定,其数据类型是不是字符串,也可以使用自定义类是
亚历山大鸟

Answers:


76

不,python没有符号类型。

但是,字符串文字默认情况下为interned,其他字符串可以使用该intern函数进行intern 。因此,在字典中使用字符串文字作为键并不比在ruby中使用符号更有效。


20
+1。对于我们Ruby开发人员来说幸运的是,性能不是一个词。(对不起,我们是如此语义化!):D
wuputah

10
这的主要好处是该语言的核心语法和内置类型少了一种。当可以透明地完成时,这是不必要的语言复杂性。
格伦·梅纳德

@Glenn起初我不高兴听到了Python没有符号和字符串文字可以作为按键。问题是我对必须在所有键周围都加上引号的事实感到不满意。有没有解决的办法?

1
@ J3M 7OR3:不,这当然是没有办法的。但是请考虑:这只是一个附加字符,在实际代码中,无论如何,您经常使用变量而不是文字键。

12
@delnan当然可以解决这个问题:dict(a = 1,b = 2,c = 3)。
Ned Batchelder

20

正如其他人所说,Python中没有符号,但是字符串可以很好地工作。

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

d = dict(
    a = 1,
    b = 2,
    c = "Hello there",
    )

1
具有讽刺意味的是,此解决方案至少在开始时确实将您限制为使用字符串作为键。
aaronasterling

是的,这是一种解决方法,但仅在分配步骤中有效。我仍然必须在d ['b']中的b周围添加引号以获取其值。我想我只是记得红宝石符号更容易输入。我希望有一个解决这个问题的模块。我不知道这是否会使程序运行缓慢。

13

对于那些感兴趣的人:在哈希中使用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的内存。


好答案!感谢您查看这个。
朱诺·伍兹

7
  1. 不,没有对等的东西。
  2. 不,您可以将每个可哈希对象用作字典键。

可以将字符串文字分配给变量,然后将该变量用作键。例如,橙色=“橙色” food_type = {橙色:“水果”,香蕉:“水果”}

@ J3M 7OR3:字符串是可哈希的!和所有不可变类型一样。关于第二个问题... Python不是Javascript-dict文字中的键并不特殊。它们可以是任何表达式(变量,文字,...),可以求值并将结果用作键。是的,这可行。

@delnan好的。但是,是使用变量而不是字符串文字作为关键的最佳实践吗?人们通常会这样做吗?还是仅使用字符串文字(带有引号)作为键就可以了?

1
@ J3M 7OR3:Wat?大多数时候,您在编写程序时可能无法知道密钥。当然k = "key"; d[k] = "value"是愚蠢的(但不是for k in keys: d[k] = "default",尽管有更好的方法),但是正如已经说过的,大多数时候您都使用运行时值作为键。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.