按值而不是引用复制列表列表
Copy a list of list by value and not reference
为了理解为什么我在程序中遇到错误,在该程序中我试图找到行列式的 "minor",我编写了一个更简单的程序,因为我的变量被搞乱了。下面的这个函数接受一个 2 * 2 矩阵作为输入,returns 一个包含其行的列表(我知道毫无意义且效率低下,但我试图理解这背后的理论)。
def alpha(A): #where A will be a 2 * 2 matrix
B = A #the only purpose of B is to store the initial value of A, to retrieve it later
mylist = []
for i in range(2):
for j in range(2):
del A[i][j]
array.append(A)
A = B
return mylist
但是,这里似乎 B 被动态分配了 A 的值,从某种意义上说,我无法将 A 的初始值存储在 B 中以供使用稍后。这是为什么?
因为python 通过引用传递列表
这意味着当你写 "b=a" 你是说 a 和 b 是同一个对象,当你改变 b 你也改变了 a,反之亦然
一种按值复制列表的方法:
new_list = old_list[:]
如果列表包含对象并且您也想复制它们,请使用泛型 copy.deepcopy():
import copy
new_list = copy.deepcopy(old_list)
A 看起来像引用类型,而不是值类型。引用类型不会在赋值时被复制(不像 R)。您可以使用 copy.copy 对元素进行深度复制
由于 Python 通过引用传递列表,A
和 B
是相同的对象。当您修改 B
时,您也在修改 A
。这种行为可以在一个简单的例子中得到证明:
>>> A = [1, 2, 3]
>>> def change(l):
... b = l
... b.append(4)
...
>>> A
[1, 2, 3]
>>> change(A)
>>> A
[1, 2, 3, 4]
>>>
如果您需要 A
的副本,请使用切片表示法:
B = A[:]
为了理解为什么我在程序中遇到错误,在该程序中我试图找到行列式的 "minor",我编写了一个更简单的程序,因为我的变量被搞乱了。下面的这个函数接受一个 2 * 2 矩阵作为输入,returns 一个包含其行的列表(我知道毫无意义且效率低下,但我试图理解这背后的理论)。
def alpha(A): #where A will be a 2 * 2 matrix
B = A #the only purpose of B is to store the initial value of A, to retrieve it later
mylist = []
for i in range(2):
for j in range(2):
del A[i][j]
array.append(A)
A = B
return mylist
但是,这里似乎 B 被动态分配了 A 的值,从某种意义上说,我无法将 A 的初始值存储在 B 中以供使用稍后。这是为什么?
因为python 通过引用传递列表
这意味着当你写 "b=a" 你是说 a 和 b 是同一个对象,当你改变 b 你也改变了 a,反之亦然
一种按值复制列表的方法:
new_list = old_list[:]
如果列表包含对象并且您也想复制它们,请使用泛型 copy.deepcopy():
import copy
new_list = copy.deepcopy(old_list)
A 看起来像引用类型,而不是值类型。引用类型不会在赋值时被复制(不像 R)。您可以使用 copy.copy 对元素进行深度复制
由于 Python 通过引用传递列表,A
和 B
是相同的对象。当您修改 B
时,您也在修改 A
。这种行为可以在一个简单的例子中得到证明:
>>> A = [1, 2, 3]
>>> def change(l):
... b = l
... b.append(4)
...
>>> A
[1, 2, 3]
>>> change(A)
>>> A
[1, 2, 3, 4]
>>>
如果您需要 A
的副本,请使用切片表示法:
B = A[:]