Python将值从一个变量分配到另一个变量

Python将值从一个变量分配到另一个变量,python,arrays,variables,Python,Arrays,Variables,我正在尝试实现某种本地搜索。为此,我有两个数组,它们代表一个列表,我正试图优化它们。 所以我有一个数组作为当前最好的数组,也是我目前正在分析的数组 开始时,我洗牌数组,并将当前最佳数组设置为洗牌数组 random.shuffle(self.matchOrder) self.bestMatchOrder = self.matchOrder 然后我交换数组中的随机相邻对。 现在的问题是,当我交换self.matchOrder中的值时,self.bestMatchOrder中的值会被交换 a = s

我正在尝试实现某种本地搜索。为此,我有两个数组,它们代表一个列表,我正试图优化它们。 所以我有一个数组作为当前最好的数组,也是我目前正在分析的数组

开始时,我洗牌数组,并将当前最佳数组设置为洗牌数组

random.shuffle(self.matchOrder)
self.bestMatchOrder = self.matchOrder
然后我交换数组中的随机相邻对。 现在的问题是,当我交换
self.matchOrder
中的值时,
self.bestMatchOrder
中的值会被交换

a = self.matchOrder[index]
self.matchOrder[index] = self.matchOrder[index + 1]
self.matchOrder[index + 1] = a
“索引”作为参数提供给函数,它只是随机生成的数字


我猜我在分配变量时做错了什么,但我不知道是什么。那么,我该怎么做才能只将数组的值分配给另一个数组,而不让它也对其应用相同的更改呢?

当您使用
self.bestMatchOrder=self.matchOrder
时,Python不会将新的内存位置分配给
self.bestMatchOrder
。并且知道列表是可变的数据类型,因此在
self.matchOrder
中所做的任何更改都会反映在
self.bestMatchOrder

import copy

self.bestMatchOrder = copy.deepcopy(self.matchOrder)

但是,如果使用线性列表或简单列表,也可以使用
self.bestMatchOrder=self.matchOrder[:]
但是如果使用嵌套列表,则
deepcopy()
是正确的选择。

当您使用
self.bestMatchOrder=self.matchOrder
时,Python不会向
self.bestMatchOrder
分配新的内存位置,而是两者都指向相同的内存位置。并且知道列表是可变的数据类型,因此在
self.matchOrder
中所做的任何更改都会反映在
self.bestMatchOrder

import copy

self.bestMatchOrder = copy.deepcopy(self.matchOrder)

但是,如果使用线性列表或简单列表,也可以使用
self.bestMatchOrder=self.matchOrder[:]
但是如果使用嵌套列表,则
deepcopy()
是正确的选择。

当您使用
self.bestMatchOrder=self.matchOrder
时,Python不会向
self.bestMatchOrder
分配新的内存位置,而是两者都指向相同的内存位置。并且知道列表是可变的数据类型,因此在
self.matchOrder
中所做的任何更改都会反映在
self.bestMatchOrder

import copy

self.bestMatchOrder = copy.deepcopy(self.matchOrder)

但是,如果使用线性列表或简单列表,也可以使用
self.bestMatchOrder=self.matchOrder[:]
但是如果使用嵌套列表,则
deepcopy()
是正确的选择。

当您使用
self.bestMatchOrder=self.matchOrder
时,Python不会向
self.bestMatchOrder
分配新的内存位置,而是两者都指向相同的内存位置。并且知道列表是可变的数据类型,因此在
self.matchOrder
中所做的任何更改都会反映在
self.bestMatchOrder

import copy

self.bestMatchOrder = copy.deepcopy(self.matchOrder)

但是,如果使用线性列表或简单列表,也可以使用
self.bestMatchOrder=self.matchOrder[:]
,但是如果使用嵌套列表,则
deepcopy()
是正确的选择。

如果要复制列表,可以使用切片操作:

list_a = [1, 2, 3]
list_b = list_a[:]
list_a = [0, 0, 42]
print list_a  # returns [0, 0, 42]
print list_b  # returns [1, 2, 3], i.e. copied values

但是如果您有更复杂的结构,您应该使用
deepcopy
,正如上面@anmol\u uppal建议的那样。

如果您想要复制列表,您可以使用切片操作:

list_a = [1, 2, 3]
list_b = list_a[:]
list_a = [0, 0, 42]
print list_a  # returns [0, 0, 42]
print list_b  # returns [1, 2, 3], i.e. copied values

但是如果您有更复杂的结构,您应该使用
deepcopy
,正如上面@anmol\u uppal建议的那样。

如果您想要复制列表,您可以使用切片操作:

list_a = [1, 2, 3]
list_b = list_a[:]
list_a = [0, 0, 42]
print list_a  # returns [0, 0, 42]
print list_b  # returns [1, 2, 3], i.e. copied values

但是如果您有更复杂的结构,您应该使用
deepcopy
,正如上面@anmol\u uppal建议的那样。

如果您想要复制列表,您可以使用切片操作:

list_a = [1, 2, 3]
list_b = list_a[:]
list_a = [0, 0, 42]
print list_a  # returns [0, 0, 42]
print list_b  # returns [1, 2, 3], i.e. copied values

但是如果你有更复杂的结构,你应该使用
deepcopy
,正如上面@anmol\u uppal建议的那样。

谢谢你的快速回答:)我已经想到了类似的方法。让我困惑的是,为什么我在对象初始化中初始化了bestMatchOrder之后,它仍然指向不同的内存位置?它可以工作,谢谢。感谢这个非常快速的答案:)我已经想到了类似的事情。让我困惑的是,为什么我在对象初始化中初始化了bestMatchOrder之后,它仍然指向不同的内存位置?它可以工作,谢谢。感谢这个非常快速的答案:)我已经想到了类似的事情。让我困惑的是,为什么我在对象初始化中初始化了bestMatchOrder之后,它仍然指向不同的内存位置?它可以工作,谢谢。感谢这个非常快速的答案:)我已经想到了类似的事情。让我困惑的是,为什么我在对象初始化中初始化bestMatchOrder之后,它仍然指向不同的内存位置?它可以工作,谢谢。