使用函数在Python中修改字典

0 投票
3 回答
683 浏览
提问于 2025-04-17 21:54

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

我想用一个函数来改变每个列表的第二个元素,就像下面这样:

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

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

print wakeup

这样做是行不通的,因为auto()在'wakeup'定义之前就引用了它。

如果我试着把这个函数放在'wakeup'定义之后,还是会出错,因为这时候'wakeup'字典又在引用auto(),而auto()还没有被定义。

我希望在列表中保持这样的语法:[15, auto(1)]

你能帮我吗?

3 个回答

1

auto 这个词其实和字典没有什么关系,你可以这样理解它。

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

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

不过,如果你的代码看起来像这样,那其实你根本不需要一个函数。

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)

在这个特定的情况下,因为你并没有重新赋值给wakeup,所以其实不一定需要用到全局变量,但最好还是养成使用它的习惯。同时,尽量少用全局变量也是个好主意。

这段代码是合法的:

def auto(t):

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

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

auto(1)
2

你在声明变量 wakeup 时调用了函数 auto,而且你还想在函数 auto 里面使用变量 wakeup

所以,实际上你是在变量 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

撰写回答