[英]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
不會復制,而是一個別名: resultsvalidation
和resultsvalidationparam
是同一對象。 您可以使用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變量並更改溫度,參數也會更改。
價值可以改變的對象被認為是可變的。 創建后其值不可更改的對象稱為不可變的。 (當更改可變對象的值時,包含對可變對象的引用的不可變容器對象的值可以更改;但是該容器仍被認為是不可變的,因為它所包含的對象的集合無法更改。因此,不可變性並不是嚴格意義上的與具有不變的值一樣,它更加微妙。)對象的可變性由其類型決定; 例如,數字,字符串和元組是不可變的,而字典和列表則是可變的。
因此,您要使兩個變量都指向同一個對象-更改對象時,它們都將指向同一對象而更改。 例如,如果要復制副本以處理字典,請嘗試
dict2 = dict(dict1)
或者也dict2 = dict1.copy()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.