imax,jmax,kmax
用于函数的后续操作。它不是归还它们。如果我不在函数中,这个小例子就像我希望的那样。
def subzoneStruct__(maxIndex):
imax = maxIndex[0]
jmax = maxIndex[1]
kmax = maxIndex[2]
print "before",locals()["imax"],imax
for ind in ["imax","jmax","kmax"]:
val=locals()[ind]
print ind,val,
if val > -1:
val=max(1, val-1)
print "in",val,
locals()[ind]=val
print locals()[ind],
print "out",locals()[ind]
print "after",locals()["imax"],imax
print imax,jmax,kmax
# Doing some stuff using imax,jmax,kmax
# ...
subzoneStruct__((10,11,12))
print "should be (9,10,11)"
如何使用相同的循环修改imax,jmax,kmax
(不一定使用locals
)?
答案 0 :(得分:1)
你真的不应该这样做,你使用局部变量作为简单字典的不良替代品。行动几乎总是更好,好像locals()
不存在。
所以这就变成了:
def subzoneStruct__(maxIndex):
maxes = {"i": maxIndex[0], "j": maxIndex[1], "k": maxIndex[2]}
for ind in ["i","j","k"]:
val=maxes[ind]
print ind,val,
if val > -1:
val=max(1, val-1)
print "in",val,
maxes[ind]=val
print maxes[ind],
print "out",maxes[ind]
print "after", maxes["i"]
return maxes["i"], maxes["j"], maxes["k"]
(可能缩进版画错误,但你明白了)
答案 1 :(得分:0)
就我而言,我找到的最有效的方法是使用综合列表
imax,jmax,kmax = [max(1, val-1) if val > -1 else val for val in maxIndex]
但我的问题仍然有效,如何从变量引用访问和修改值(使用name或id或...)。所以,如果你对这一点有答案,可以在这里添加它。
答案 2 :(得分:0)
正如RemcoGerlich所说,你不应该这样做。但是,存储三个变量并不需要字典,因为只需要简单的list
。以下内容可能会有所缩短,但它的目的是为了尽可能清楚地显示它所做的事情,并采用与您问题中的代码类似的方式。
def subzoneStruct__(maxIndex):
maxIndex = list(maxIndex) # convert to mutable sequence
imax, jmax, kmax = range(3)
print 'before:', maxIndex[imax], maxIndex[jmax], maxIndex[kmax]
for ind in imax, jmax, kmax:
val = maxIndex[ind]
if val > -1:
val = max(1, val-1)
maxIndex[ind] = val
print 'after:', maxIndex[imax], maxIndex[jmax], maxIndex[kmax]
# ...
subzoneStruct__((10,11,12))
print "should be (9,10,11)"