Python 字典的行为

Python 字典的行为,python,dictionary,Python,Dictionary,代码如下: checkDictionary = { '0': (print('0'),0), '1': (print('1'),1), '2': (print('2'),2) } print(checkDictionary.get('1','Not found')) 我期望的结果是: 1 (None, 1) 但它会运行每个值字段中的所有函数: 0 1 2 (None, 1) 有人能解释这种行为吗?为什么要这样实施 我从多个来源听说Python字典“在大多

代码如下:

checkDictionary = {
    '0': (print('0'),0),
    '1': (print('1'),1),
    '2': (print('2'),2)
    }


print(checkDictionary.get('1','Not found'))
我期望的结果是:

1
(None, 1)
但它会运行每个值字段中的所有函数:

0
1
2
(None, 1)
有人能解释这种行为吗?为什么要这样实施

我从多个来源听说Python字典“在大多数情况下”应该是O(1)快的

因此,我真正想要完成的是制作一个具有多个执行行的漂亮开关/案例:

def readPoint(v):
    print(f'Point: {v}')

def readLine(v):
    print(f'Line: {v}')

Point = 1
Line = 2
segment = [1,1]
checkDictionary = {
    Point: "geometry = readPoint(segment)\n__type='Point'",
    Line: "geometry = readLine(segment)\n__type='Line'"
    }


exec(checkDictionary.get(segment[0],'raise ValueError("Some error")'))

这种设计模式会有一些问题吗?不要在意函数或变量,它们只是示例。

这完全是意料之中的,决不是奇怪的行为。理解的关键是知道在声明字典时会创建它(对键和值进行计算)

在您的情况下,对值的求值将导致执行
打印
语句。

这就是为什么你会得到:

0
1
2
3
4
5
6
7
然后是打印(checkDictionary.get('1','notfound'))

预期会产生:

(None, 1)

它之所以这样做是因为无论你在哪里调用
print
它都会打印,所以解决这一问题的最佳方法是删除打印或其他内容,而且
print
是一个none类型

实际上,
(None,1)
是代码的输出,只是当您创建字典时,它正在打印


因此,在代码结束时,当声明
checkDictionary
并且字典中充满了文字时,打印语句就会执行,即
{'0':(无,0),'1':(无,1),'2':(无,2),'3':(无,3),'4':(无,4),'5':(无,5),'6':(无,6),'7':(无,7)}
。我不清楚你剩下的问题与最后一句有什么关系。这完全不是字典所特有的,列表
[(print('0'),0)]
在定义时也会打印,然后包含
(None,0)
。打印函数就是其中的一个例子。起初,我试图让som exec函数运行多行代码,但struct是否发现,如果它与我的键值一致,我的所有exec行都会运行。谢谢,因此,如果我希望函数作为值进入,我可以将其设置为字符串并计算结果。您可以这样做,但计算字符串可以是一个值。@PaalPedersen函数是Python中的第一类函数,如果您不调用它们,您可以将它们作为值放入。查看
lambda
functools.partial
以创建带有预设参数的可调用项。我不建议进行串接和评估。