【问题标题】:Function argument: original variable is modified even if passed by value [duplicate]函数参数:即使按值传递,原始变量也会被修改[重复]
【发布时间】:2015-03-15 16:23:53
【问题描述】:

我有一个函数,它基本上使用 dijkstra 算法来查找图中的距离

def getDistances(q,start):

print(q)

q[start][0] = 0
queue = [start]
while len(queue):


    m = []


    mMin = queue[0]
    m = q[mMin][2]
    queue.remove(mMin)


    for x in q[m][3]:

        if q[x][1] == 0:

            if not x in queue:
                queue.append(x)

            if q[x][0] > q[m][0] + 1:

                q[x][0] = q[m][0] + 1

    q[m][1] = 1

return [x[0] for x in q]

但它工作得很好。但是,我必须多次调用此函数。并且“q”参数保持不变。这是调用:

for ex in exits:
    dist = getDistances(list(qt),ex)
    distances.append([ex,dist])

"qt" 本身是一个包含许多不同参数的列表。在这种情况下,我认为它不如问题本身重要。

问题 如果在函数内部修改了“q”变量,则修改了“qt”变量。正如您在调用中看到的那样,我尝试使用list(qt) 通过值而不是引用传递变量。 提前感谢您的帮助!

【问题讨论】:

    标签: python python-3.x parameter-passing pass-by-reference pass-by-value


    【解决方案1】:

    你必须创建一个deepcopy:

    from copy import deepcopy
    
    dist = getDistances(deepcopy(qt), ex)
    

    【讨论】:

      【解决方案2】:

      您还需要复制列表中的元素。例如:q[x][0] = q[m][0] + 1 修改它们。做:

      dist = getDistances(list(list(e) for e in qt), ex)
      

      【讨论】:

        猜你喜欢
        • 2019-10-21
        • 2016-01-13
        • 1970-01-01
        • 2020-01-22
        • 2019-07-27
        • 2018-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多