python 返回 list 错误

2015-10-07 02:46:26 +08:00
 lbfeng

JRM 是二维 list, best_RJM 总是返回循环最后一次生成的 new_RJM 而不是 best_cost 对应的 new_RJM. 这里的 list 需要怎么处理才能正确值呢?

def sls(RJM, n):
    initNode = Node(0, 0)
    initNode.distance = 0
    best_cost = ucs(RJM, initNode)
    # best_RJM = RJM
    for i in range(n):
        new_RJM = random_change(RJM,len(RJM))
        result = ucs(new_RJM, initNode)
        if best_cost < result:
            best_cost = result
            RJM = new_RJM
            best_RJM = new_RJM
        else:
            pass
    return best_RJM, best_cost
2668 次点击
所在节点    Python
7 条回复
jky
2015-10-07 03:51:42 +08:00
目测 best_RJM 和 new_RJM 都指向 RJM ,给 best_RJM 或 new_RJM 赋值的时候新建一个 list 应该就可以了
biggun
2015-10-07 04:10:48 +08:00
import copy
RJM = copy.deepcopy(new_RJM)
best_RJM = copy.deepcopy(new_RJM)
或者
RJM = new_RJM[:]
best_RJM = new_RJM[:]

python 里一般的 assignment 都是指向同一个 reference 。所以本质上 best_RJM, new_RJM 和 RJM 都是一个东西
lbfeng
2015-10-07 04:20:06 +08:00
@jky 已改成 best_RJM = list(new_RJM) 结果居然没变,还是返回循环最后一次生成的 new_RJM 。
lbfeng
2015-10-07 04:29:02 +08:00
best_RJM = RJM[:]
in loop
RJM = new_RJM[:]
best_RJM = new_RJM[:]

@biggun 还是返回循环最后一次生成的 new_RJM 。
skydiver
2015-10-07 06:15:36 +08:00
@lbfeng 二楼都给你答案了,你得深拷贝才行,要不然元素还都是同一个引用
lbfeng
2015-10-07 06:47:54 +08:00
@skydiver 谢谢, deepcopy 管用。切片为什么没用呢?
biggun
2015-10-07 06:51:40 +08:00
@lbfeng
@skydiver 。。貌似切片也是 shallow copy 。 my bad

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/226006

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX