要理解为什么我在程序中遇到错误,我试图找到一个决定因素的“次要”,我写了一个更简单的程序,因为我的变量搞砸了。下面这个函数接受一个2 * 2矩阵作为输入,并返回一个包含其行的列表(无意义和低效,我知道,但我正在尝试理解这背后的理论)。
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 动态的值,因为我无法将B的初始值存储在B中以便以后使用它。那是为什么?
答案 0 :(得分:10)
因为python通过引用传递列表 这意味着当你写“b = a”时,你说a和b是同一个对象,当你改变b时你也改变a,反之亦然
按值复制列表的方法:
new_list = old_list[:]
如果列表包含对象并且您也想要复制它们,请使用通用copy.deepcopy():
import copy
new_list = copy.deepcopy(old_list)
答案 1 :(得分:2)
A看起来像引用类型,而不是值类型。在分配时不复制引用类型(与例如R不同)。您可以使用copy.copy制作元素的深层副本
答案 2 :(得分:2)
由于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[:]