函数参数:即使按值传递,原始变量也会被修改
Function argument: original variable is modified even if passed by value
我有一个函数,它主要使用 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)
按值而不是按引用传递变量。
提前感谢您的帮助!
您也需要复制列表中的元素。例如:q[x][0] = q[m][0] + 1
修改它们。做:
dist = getDistances(list(list(e) for e in qt), ex)
您必须创建一个 deepcopy
:
from copy import deepcopy
dist = getDistances(deepcopy(qt), ex)
我有一个函数,它主要使用 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)
按值而不是按引用传递变量。
提前感谢您的帮助!
您也需要复制列表中的元素。例如:q[x][0] = q[m][0] + 1
修改它们。做:
dist = getDistances(list(list(e) for e in qt), ex)
您必须创建一个 deepcopy
:
from copy import deepcopy
dist = getDistances(deepcopy(qt), ex)