Python 不断覆盖参数,即使在函数内部或外部复制也是如此



我的第一个问题在这里。我希望我能使它尽可能清晰和翔实。

我目前正在使用python,并且是新手。不过我喜欢这门语言,很多简化让你的代码非常简洁。

我目前有一个接受参数的函数。即使我将其复制到函数内的局部变量,该参数也会被覆盖。即使复制到函数外部(以及传递给函数的参数),它也会覆盖原始参数。

这里的函数:我所说的论点是resultsvalidationparam .这可能是一个简单的错误,因为我已经盯着这个一段时间了,但我在互联网上找不到我问题的答案。

    def mean_cluster_validation(resultsvalidationparam, validationmethods, mean_methods = 'relative'):
resultsvalidation = resultsvalidationparam
n_clusters = np.arange(2,2 + len(resultsvalidation.keys()))
clustermethods = tuple(resultsvalidation[str(2)].keys())
'''
First we find the best and worst score for each validation method (which gives a certain clustern and clustermethod). After which all scores are made
relative to those scores (giving them values between 0 and 1). Some validations methods are best when low or high values, this is taken into account. 
'''    
# Find max and min
validationMax = {}
validationMin = {}
for t in validationmethods:
    currentMax = (0,)# list containing max value, clustering method and number of clusters where value is max for certain validation method
    currentMin = (100000,)
    for i in n_clusters:
        for j in clustermethods: 
            if resultsvalidation[str(i)][j][t] is not None:
                if resultsvalidation[str(i)][j][t] > currentMax[0]:
                    currentMax = (resultsvalidation[str(i)][j][t],i,j)
                if resultsvalidation[str(i)][j][t] < currentMin[0]:
                    currentMin = (resultsvalidation[str(i)][j][t],i,j)
    validationMax[t] = currentMax
    validationMin[t] = currentMin
for t in validationmethods:
    for i in n_clusters:
        for j in clustermethods:
            if resultsvalidation[str(i)][j][t] is not None:
                resultsvalidation[str(i)][j][t] = (resultsvalidation[str(i)][j][t] - validationMin[t][0])/(validationMax[t][0] - validationMin[t][0])
return validationMax, validationMin, resultsvalidation

即使我在变量函数之外使用副本(例如"t"),它仍然会覆盖原始变量

我很卡住,再次道歉,如果我错误地提出了这个问题,我的英语很差。

在python中,赋值resultsvalidation = resultsvalidationparam不是复制,而是别名:resultsvalidationresultsvalidationparam是同一个对象。您可以使用 is 运算符进行检查。

看起来resultsvalidationparam是一个字典,因此您可以使用 resultsvalidation = resultsvalidationparam.copy() 创建它的副本。但是,这只会创建一个浅拷贝,因此不会复制其中包含的任何对象。这将制作一个深层副本:

import copy
resultsvalidation = copy.deepcopy(resultsvalidationparam)

为此,对可变和不可变类型有很好的了解会有所帮助。请参阅此处以获取很好的解释

简而言之,假设您正在通过的论点是这样的

param = {'a': 2, 'b': 3}

现在,如果我们:

temp = param 
print temp # {'a': 2, 'b': 3}

我们更改temp的值:

temp['a'] = 8

现在我们再次检查param并:

print param
{'a': 8, 'b': 3}

与您的问题一样,即使我们将参数复制到临时变量并更改温度,参数也会发生变化。

从 Python 数据模型

其值可以更改的对象称为可变对象

;其值一旦创建就不可更改的对象称为不可变对象。(包含对可变对象的引用的不可变容器对象的值可以在后者的值更改时更改;但是容器仍被视为不可变,因为它包含的对象集合无法更改。因此,不变性并不严格地等同于具有不可更改的值,它更微妙。对象的可变性由其类型决定;例如,数字、字符串和元组是不可变的,而字典和列表是可变的。

所以你让你的两个变量都指向同一个对象 - 当它被改变时,两个变量都会改变,因为它们指向同一个东西。例如,如果要复制字典以处理字典,请尝试

dict2 = dict(dict1)

或者也dict2 = dict1.copy()

最新更新