如何通过python函数中的引用修改变量的值?
我试图修改某个变量的值,但我只能成功读取值,不能修改。在下面的SWE中,要点是在函数后面的循环末尾有三个变量如何通过python函数中的引用修改变量的值?,python,Python,我试图修改某个变量的值,但我只能成功读取值,不能修改。在下面的SWE中,要点是在函数后面的循环末尾有三个变量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
。这不是归还它们。如果我不在函数中,这个小示例的工作方式与我希望的一样
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
)。如果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"]
(可能缩进打印错误,但你明白了)在我的例子中,我发现最有效的方法是使用综合列表
imax,jmax,kmax = [max(1, val-1) if val > -1 else val for val in maxIndex]
但关于如何访问和修改变量引用中的值(使用名称或id或…),我的问题仍然有效。因此,如果你对这一点有一个答案,最好在这里加上。正如雷姆科格里希所说,你不应该这样做。然而,不需要字典来存储这三个变量,因为只需要一个简单的
列表。下面的内容可以略为缩短,但编写它是为了尽可能清楚地展示它在做什么,并且以一种类似于您问题中的代码的方式
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)"
谢谢你的回答,为了更具体,我对我的问题做了一些修改。我不想使用另一个变量(dictionnary),因为我在函数的隐藏部分已经需要imax、jmax、kmax
;记住,函数的长度应该是5行左右,如果比这多的话,你的函数就太长了。在这里显示您的全部代码,以获得好的答案,而不仅仅是小部分。最后,你真的,真的,不需要locals(),相信我,我不能显示all函数,它大约有200行长。但问题是,我将使用这三个变量imax、jmax、kmax
,并以相同的方式更正它们。我同意应该避免使用局部变量
,但有没有其他方法可以获取引用的值?