如何在python函数中通过引用修改变量的值?

2024-10-01 07:28:56 发布

您现在位置: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"]:
    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)?你知道吗


Tags: 函数in重点val例子sweprint末尾
3条回答

正如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)"

在我的例子中,我发现最有效的方法是使用综合列表

imax,jmax,kmax = [max(1, val-1) if val > -1 else val for val in maxIndex]

但我的问题仍然是如何从变量引用中访问和修改值(使用名称或id或…)。所以如果你对这一点有一个答案,在这里加上它会很好。你知道吗

你真的不应该这样做,你在用局部变量来代替简单的字典。如果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"]

(可能印错了,但你明白了)

相关问题 更多 >