我有一个字典(下面代码中的'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)]
你能帮帮我吗?
答案 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)