如果没有调用函数,函数是如何更改的?

时间:2017-03-23 02:53:28

标签: python

def generateNew(data):

    for i in range(len(data)-1):
        data[i].append(data[i+1][2])
    data[-1].append(oP)

    for i in range(len(data)-1):
        data[i].append(data[i+1][0])
        data[i].append(data[i+1][1])
    data[-1].append(hlP[0])
    data[-1].append(hlP[1])

    for i in range(len(data)-1):
        data[i].append(data[i+1][4])
    data[-1].append(volume)

    new = [hlP[0], hlP[1], oP, cP, volume]
    print new
    return new

dataSet = []
for i in f.readlines():
    i = i.split(',')
    x = [float(j) for j in i[1:-1]]
    x.append(int(i[-1]))
    dataSet.append(x)
dataSet.reverse()
mData = dataSet # for next loop, append new set

for i in range(10):
    temp = predictNew(mData)
    print dataSet
    dataSet.append(temp)
    mData = dataSet

这是我的代码。 dataSet[[1,2,3,4],[1,2,3,4]....]类似,然后我将其分配给mData并将其传递给函数generateNew(我删除了一些不必要的细节),列表是现在像[[1,2,3,4,5,6],[1,2,3,4,5,6]....]。但是,我认为不应该更改dataSet和'mData',因为所有的更改都发生在函数内部,事实并非如此。任何人都可以告诉我为什么并改进吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么当您不希望更改时,您将获得更改数据集。如果这是问题,那么这一问题就出现在这一行:

mData = dataSet # for next loop, append new set

为了纠正这个问题,我会研究Python的复制和深度复制。当你复制'以这种方式列表,它实际上并没有制作另一个副本,而是引用原始副本。例如:

x = [1]
y = x
x.append(2)
x     #expected output is [1, 2] because we added 2 to this.
>>>[1, 2]
y     #y changes, even though it wasn't directly modified.
>>>[1, 2]

解决此问题的最简单方法是使用拼接复制:     y = x [:] 但是,由于您在列表中有列表,因此无法解决您的问题。你需要(我认为)是来自copy module的深度复制。如果我帮忙,请告诉我!