簡體   English   中英

即使在函數內或函數外復制,Python仍會覆蓋參數

[英]Python keeps overwriting argument, even when copied in or outside of function

我的第一個問題在這里。 我希望我能使它盡可能清晰和有益。

我目前正在使用python,並且是它的新手。 不過,我喜歡這種語言,它有很多簡化之處,使您的代碼非常簡潔。

我目前有一個接受參數的函數。 即使我將其復制到函數內部的局部變量中,該參數也會被覆蓋。 即使在函數外(以及傳遞給函數的參數)復制時,它也會覆蓋原始參數。

這里的功能:我正在談論的參數是resultsvalidationparam 這可能是一個直截了當的錯誤,因為我已經凝視了一段時間,但是我無法在Internet上找到問題的答案。

    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是一個dict,因此您可以使用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}

與您的問題一樣,即使我們將參數復制到temp變量並更改溫度,參數也會更改。

Python數據模型

價值可以改變的對象被認為是可變的。 創建后其值不可更改的對象稱為不可變的。 (當更改可變對象的值時,包含對可變對象的引用的不可變容器對象的值可以更改;但是該容器仍被認為是不可變的,因為它所包含的對象的集合無法更改。因此,不可變性並不是嚴格意義上的與具有不變的值一樣,它更加微妙。)對象的可變性由其類型決定; 例如,數字,字符串和元組是不可變的,而字典和列表則是可變的。

因此,您要使兩個變量都指向同一個對象-更改對象時,它們都將指向同一對象而更改。 例如,如果要復制副本以處理字典,請嘗試

dict2 = dict(dict1)

或者也dict2 = dict1.copy()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM