在 python 中调用函数后更改变量值

Variable value getting changed after a function call in python

提问人:Sree 提问时间:11/20/2019 最后编辑:Sree 更新时间:11/20/2019 访问量:54

问:

我在 python 函数之间的变量值中观察到一种奇怪的行为,我无法理解其背后的正确原因。我有两个功能,如下所示

def a():
    seg_map = np.zeros([224,224],dtype=float)                                                                                                                           
    while True:
      print("Calling expand foreground method")
      new_seg_map = expandforeground2(seg_map,cams_dict[name],z,seg_result,hypercols)                                                                                             
      print(seg_map)                                                                                                                                                              
      print(np.array_equal(seg_map,new_seg_map))                                                                                                                                  
      if np.array_equal(new_seg_map,seg_map):
                print('break')
                break
      seg_map = new_seg_map 

def expandforeground2(seg_map,cam_map,layer_no,seg_result,hypercol_result):
        threshold = np.amax(hypercol_result) * 0.8
        temp_map = seg_map
        #do some manipulations on temp_map 
        return temp_map

现在,在从函数调用函数后,我看到函数中的值被修改为函数中的值,并且始终是。我不明白为什么会这样。我看到了一些相关的问题,但没有一个能解决我的问题。有人可以解释一下这背后的原因以及我应该如何解决这个问题吗?expandforeground2aseg_mapaexpandforeground2np.array_equal(seg_map,new_seg_map)True

我希望 in 函数的值保持不变,函数的返回值应存储在 .seg_mapaexpandforeground2new_seg_map

python-3.x 函数 oop 按引用传递

评论

3赞 luigigi 11/20/2019
这可能是因为您只是返回了 .如果你这样做,你没有两个列表。有两个引用指向同一个列表对象。在返回之前,您可能需要使用复制seg_maptemp_map = seg_maptemp_map = seg_map.copy()
0赞 Sree 11/20/2019
@luigigi,但为什么会发生变化,为什么会发生在这里?这不是通常的行为,对吧?您能否详细说明在返回之前制作副本。我不想在这里改变。seg_mappass by referenceseg_map
0赞 Sree 11/20/2019
@luigigi,我尝试了你的答案,但不幸的是我仍然有同样的问题。
0赞 luigigi 11/20/2019
显然,您必须在操作之前复制列表,而不是在返回之前复制列表。我在第一个答案中搞砸了
0赞 Marius 11/20/2019
在 Python 中,对象变量是指向对象的指针。因此,当您返回传入的相同对象时。如果希望该函数返回修改后的副本,则需要像另一个海报建议的那样显式创建副本。return temp_map

答: 暂无答案