通过调用Python3中的哈希表值来增加整数?

通过调用Python3中的哈希表值来增加整数?,python,python-3.x,Python,Python 3.x,你会认为这很容易 我有以下代码: key_handlers=collections.defaultdict(lambda: None) key_handlers['+']=operator.iadd(tickrate,1) key_handlers['-']=operator.iadd(tickrate,-1) 当然,Tickrate是一个全局int。后来,我有了类似的东西(我现在已经丢失了原始代码,用一个elif链替换了它): …这不起作用,因为iadd只对可变类型进行就地添加,INT是不可

你会认为这很容易

我有以下代码:

key_handlers=collections.defaultdict(lambda: None)
key_handlers['+']=operator.iadd(tickrate,1)
key_handlers['-']=operator.iadd(tickrate,-1)
当然,Tickrate是一个全局int。后来,我有了类似的东西(我现在已经丢失了原始代码,用一个elif链替换了它):


…这不起作用,因为iadd只对可变类型进行就地添加,INT是不可变的。你不能在lambdas中赋值,我也不希望有一个完整的函数来给一个数加一。如何在不牺牲Pythonic ness的情况下进行此操作?

您可以使用自己选择的默认值启动
defaultdict
。例如:

from collections import defaultdict
key_handlers = defaultdict(lambda : tickrate)
但是,从上面的例子来看,我认为您真正想要的是更新全局状态的方法的
dict
。这是从上面@utdemir的评论扩展而来的:

global tickrate
key_kandlers = {'+': lambda : 1, '-': lambda : -1}
func = key_handlers.get(event.type, None)
if func is not None:
    tickrate += func()

上面的示例将您限制为仅操作
tickrate
状态,因此您可能需要更健壮的东西。但是上面使用
event.type
获取函数的一般形式非常有用

但不能增加不可变的。您始终必须替换该值。因此,最好的方法是让
key\u处理程序
方法返回新值并使用该返回值。另一种方法是将
tickrate
作为自定义对象,支持您可以对其调用的递增和递减操作。@MartijnPieters,我不能做前者,因为密钥处理程序本身正在被lambdas访问。后者是可行的,但要定义一个全新的数字类来定义一个上下浮动的数字似乎非常奇怪:\@Schilcote就是这样,或者重写Python来获得可变整数。或者只编写一个
increment\u tick
函数,将整数作为包含
global tickrate的参数;滴答声+=i
。并使用
functools.partial
将其分配给具有
1
-1
的dict。
global tickrate
key_kandlers = {'+': lambda : 1, '-': lambda : -1}
func = key_handlers.get(event.type, None)
if func is not None:
    tickrate += func()