在我使用python的过程中,我遇到了一个阻塞问题。我有一些SomeFunction应该做一些简单的计算(并且还要对它进行排序 - 我删除那段代码以使其更清晰)在整数给定的向量上并返回新的。 主要问题是,每个内部循环的结果必须成为下一个的输入,但变量k和X似乎在内存中具有相同的地址。
功能如下:
def SomeFunction(k, N):
X = range(N);
for i in range(N):
for j in range(3):
X[i] = k[i]*2;
print "X:";
print X;
print "k -> :";
print k
k = X;
print "============================";
return k;
并产生输出:
X: [0, 1, 2, 3, 4, 5, 6, 7] k -> : [0, 1, 2, 3, 4, 5, 6, 7] ============================ X: [0, 8, 2, 3, 4, 5, 6, 7] k -> : [0, 8, 2, 3, 4, 5, 6, 7] ============================
第一个循环的输出没问题,因为第一个元素是0,但是对于其余的循环,你可以看到问题。 X应该有新值,而k应该是相同的。有谁知道如何解决这个问题?
答案 0 :(得分:5)
当你说
时k = X;
您没有在X
中创建k
的副本,但您要使X
和k
指向同一列表。您可以像这样创建列表的副本
k = X[:]
注意: Python不希望行尾有;
。
答案 1 :(得分:2)
您可以使用切片表示法将数组内容复制到另一个,保留列表ID:
k[:] = X[:]
答案 2 :(得分:1)
试试这个:
def SomeFunction(k = range(8),N=8):
X = range(N)
for i in range(N):
for j in range(3):
X[i] = k[i]*2
print "X:"
print X
print "k -> :"
print k
k = X[:]
print("============================")
return k
SomeFunction()
答案 3 :(得分:-1)
我不确定这是否应该作为答案或评论发布,但这完全涵盖了您的问题:python list by value not by reference。
我决定给出解释的答案。
默认情况下,Python在这种情况下使用引用。所以你是对的,X
和k
实际上指向列表的同一个实例。你想要的是制作内容的深层副本。