Python 函数不返回切换列表

Python 函数不返回切换列表,python,Python,我正在研究模拟退火的旅行推销员问题,需要编写一个函数,交换列表中的两个元素(列表包含销售人员旅行的目的地,我假设他从他返回的同一个城市开始)。我已将代码包括在下面: def new_walk(old_walk): n1 = rand.randint(1, len(old_walk)-2) n2 = rand.randint(1, len(old_walk)-2) walk = old_walk walk[n1], walk[n2] = walk[n2], walk

我正在研究模拟退火的旅行推销员问题,需要编写一个函数,交换列表中的两个元素(列表包含销售人员旅行的目的地,我假设他从他返回的同一个城市开始)。我已将代码包括在下面:

def new_walk(old_walk):
    n1 = rand.randint(1, len(old_walk)-2)
    n2 = rand.randint(1, len(old_walk)-2)
    walk = old_walk
    walk[n1], walk[n2] = walk[n2], walk[n1]
    return walk
n1和n2是与我想要切换的两个随机列表索引相对应的两个整数,
randint
函数的最大值中
len(old_cycle)-2
的原因是我不想切换最后一个点。
如果我在函数定义中包含一个print语句,它将给出正确的结果,旧_循环的两个元素将被切换。但是,一旦我将其返回到main函数,它就会返回旧的_循环列表。任何帮助都将不胜感激

我已经尝试使用我的python shell,它的版本是3.5.2,但是结果显示您的代码运行得非常好。纯粹基于python编程,我强烈建议您使用
walk=old_walk[:]
复制列表。

您应该从代码的主要部分发布代码。我想这就是问题所在。当你做
walk=old\u walk
时,你实际上没有复制,你需要添加
[:]
,感谢所有的回复人员@ezdazuzena,它给了我想要的结果代码应该仍然可以工作,即使列表没有一个浅/深的副本。但是,它会影响其父环境中的原始列表参数,这可能会产生意外行为(反之亦然)。为什么简单地设置
walk=old_walk
不起作用?python是一种动态编程语言,这意味着在使用之前不需要专门定义数据类型,解释器会自动为您执行。然而,它存在一些危险,有时会混淆这些变量的类型。对于您的情况,我认为您的python解释器可能混合了名称空间。@DamianAnslik阅读了python中的名称绑定。这与“python解释器混合名称空间”无关,这不是一件事。@acushner,我碰巧发现你是对的。下面是关于python
列表的一些内容。总之,如果有人直接使用
new\u list=old\u list
复制
list
,那么
new\u list
old\u list
可能会引用相同的内存地址,因此修改其中一个将导致另一个的更改。然而,我认为在不同的python版本中,或者确切地说,在不同的系统和安装中,这并不是一个广泛的问题。