【问题标题】:List value changes while i'm not using it in the function列表值更改,而我没有在函数中使用它
【发布时间】:2019-09-23 00:45:36
【问题描述】:

我正在尝试将数据集划分为不确定且确定的值。我为此目的制作了不同的函数,但是当我调用该函数以使值不确定时,某个值也发生了变化。这是它的样子:

我阅读了一些已回答的问题,他们说我需要复制我的列表,我这样做了,但问题仍然存在。

def loadCertainDataset(a, b, dataset=[], dataset1=[], trainCe=[], testCe=[]):
    temp=dataset[:]
    temp1=dataset1[:]
    for x in range(0,a):
        for y in range(4):
            temp[x][y]=float(temp[x][y])
        trainCe.append(temp[x])
    for x in range(0,b):
        for y in range(4):
            temp1[x][y]=float(temp1[x][y])
        testCe.append(temp1[x])

def loadUncertainDataset(a,b,dataset=[],dataset1=[],trainUn=[],testUn=[]):
    temp=dataset[:]
    temp1=dataset1[:]
    c=0
    for x in range(a,len(dataset)):
        for y in range(4):
            d=float(temp[c][y])
            temp[c][y]=uniformProb(5,d,5)
        trainUn.append(temp[c])
        c+=1
    c=0
    for x in range(b,len(temp1)):
        for y in range(4):
            d=float(temp1[c][y])
            temp1[c][y]=uniformProb(5,d,5)
        testUn.append(temp1[c])
        c+=1

def loadDataset(filename, split, trainingSet=[] , testSet=[]):
    with open(filename, 'rb') as csvfile:
        lines = csv.reader(csvfile)
        dataset = list(lines)
        for x in range(len(dataset)-1):
            for y in range(4):
                dataset[x][y] = float(dataset[x][y])
            if random.random() < split:
                trainingSet.append(dataset[x])
            else:
                testSet.append(dataset[x])

def main():
    trainingSet=[]
    trainCe=[]
    testSet=[]
    testCe=[]
    split = 0.67
    # loading dataset
    loadDataset('iris.data', split, trainingSet, testSet)
    n=len(trainingSet)/2
    m=len(testSet)/2
    #split first half for certain dataset
    loadCertainDataset(n,m,trainingSet,testSet,trainCe,testCe)
    trainUn=[]
    testUn=[]
    #other half for uncertain dataset
    loadUncertainDataset(n,m,trainingSet,testSet,trainUn,testCe
    print(testCe)

main()

我希望 print(testCe) 的输出为二维数组

> [6.2, 3.4, 5.4, 2.3, 'Iris-virginica']

但我得到的是3维数组

> [array([9.6913696 , 9.36996183, 7.5334876 , 6.80333322, 7.3538702 ]),
> array([5.32638532, 7.3171699 , 4.49632398, 3.86691709, 7.90622172]),
> array([6.89951614, 7.58021047, 7.5585632 , 8.85561941, 5.47507325]),
> array([5.3910737 , 5.0039284 , 1.97381302, 6.51333703, 4.07850765]),
> 'Iris-versicolor'], [array([ 6.85037363,  7.67665646,  8.09445476, 
> 6.24119721, 10.67032386]), array([4.46818369, 7.66358385, 4.24088535, 6.71903264, 7.6154301 ]), array([7.1805261 , 8.75463451, 8.98668969, 9.24723654, 4.85404661]), array([4.58140956, 1.5211153 , 3.72896749, 4.63736249, 4.26095836]), 'Iris-versicolor']

3维数组应该是不确定的数据集,但testCe应该是确定的(2维数组)。当我不打电话时

> loadUncertainDataset(...)

print(testCe) 将返回二维数组。请帮忙。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    在 python 中,列表和字典是可变的。这意味着

    def myfunc(a=[]):
        a.append(0)
        print(a)
    
    myfunc()
    myfunc()
    myfunc()
    

    将打印

    [0]
    [0, 0]
    [0, 0, 0]
    

    因为a 总是指向同一个列表。

    你需要做的是:

    def myfunc(a=None):
        if a is None:
            a = []
        a.append(0)
        print(a)
    

    这会给你:

    [0]
    [0]
    [0]
    

    如果你经常这样做,你可以编写一个函数来自动化这个:

    def default_vals(callable, *args):
        return tuple(arg if arg is not None else callable() for arg in args)
    
    
    def myfunc(a=None, b=None, c=None):
        a, b, c = default_vals(list, a, b, c)
        a.append(0)
        b.append(1)
        c.append(2)
        print(a, b, c)
    
    myfunc()
    myfunc()
    

    将打印

    [0] [1] [2]
    [0] [1] [2]
    

    为了使它更容易,您可能可以编写某种装饰器来进一步自动化。

    【讨论】:

    • 或者你也可以为trainCe = trainCe[:]testCe = testCe[:]添加副本
    • 好的,我可以理解在我的代码中,trainingSet 和 testSet 是否会因为它的 mutable 属性而改变。但是我将 trainCe 和 trainUn 声明为不同的列表,当我更改 trainUn 时,trainCe 也发生了变化
    • 哦,在函数 loadCertainDataset() 和 loadUncertainDataset() 我使用切片方法复制了列表,仍然出现问题
    • 是因为我还在用python-2.7吗?
    • 不,这就是python的设计方式。函数中的参数在函数初始化时初始化,而不是在函数调用时初始化。这在python3中也是一样的。
    猜你喜欢
    • 2014-11-27
    • 2023-02-23
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2013-09-04
    • 2017-10-22
    相关资源
    最近更新 更多