使用python中的def来改变字典

时间:2014-03-12 09:24:40

标签: python dictionary

我有一个字典(下面代码中的'wakeup'),其中的值是列表。

我想使用def更改每个列表的第二个元素,如下所示:

def auto(t):
    wakeup('zone1')[1] = wakeup('zone1')[0] - t

wakeup = {'zone1': [15, auto(1)],
          'zone2': [15, auto(1)]}

print wakeup

它不起作用,因为auto()在定义唤醒之前引用唤醒。

然而,如果我尝试通过在唤醒定义之后使用def来解决这个问题,那么我仍然会收到一个错误,因为这次唤醒字典会在auto()定义之前引用auto()。

理想情况下,我希望将此语法保留在列表中:[15,auto(1)]

你能帮帮我吗?

3 个答案:

答案 0 :(得分:2)

您在变量auto的声明中调用函数wakeup,并且您尝试在函数wakeup内使用变量auto

因此,您实际上是在实例化之前尝试使用变量wakeup

首先,您需要确定变量wakeup所需的初始值:

wakeup = {'zone1': [15, zone1_def_val],
          'zone2': [15, zone2_def_val]}

然后,您可以在需要时调用函数auto

def auto(t):
    wakeup['zone1'][1] = wakeup['zone1'][0] - t

auto(2)
auto(3)
auto(5)
...
print wakeup

请注意,在访问字典中的元素时,您需要使用[]而不是()

wakeup['zone1'] # good
wakeup('zone1') # bad

答案 1 :(得分:1)

auto实际上与字典无关,你应该这样定义它。

def auto(n, t):
    return n - t

wakeup = {'zone1': [15, auto(15, 1)], 'zone2': [15, auto(15, 1)]}

但如果您的实际代码与此类似,那么您根本不需要一个功能。

答案 2 :(得分:1)

您的代码无效。

修改函数内部字典的最佳方法是将其作为参数传递

def auto(d, t):
    for l in d.values():
        l[1] = l[0] - t

wakeup = {'zone1': [15, 0],
          'zone2': [15, 0]}

auto(wakeup, 1)

如果您仍想修改字典但不想将其作为参数传递,请使用全局语法

def auto(t):
    global wakeup
    for l in wakeup.values():
        l[1] = l[0] - t

wakeup = {'zone1': [15, 0],
          'zone2': [15, 0]}

auto(1)

在这种特殊情况下,由于你没有重新分配唤醒,你真的不需要全局,但最好总是使用它,就像最好尽可能避免使用全局变量一样。

此代码有效:

def auto(t):

    for l in wakeup.values():
        l[1] = l[0] - t

wakeup = {'zone1': [15, 0],
          'zone2': [15, 0]}

auto(1)