2017-10-08 90 views
0

我最近試圖在Python中編寫和操作一個類,並且遇到了一個奇怪的情況。每當我嘗試操作一個類的實例化變量時,它只會影響它所在位置的變量。例如:在Python中,爲什麼類中某個變量的dictonary值發生變化,而不是變量本身?

class test: 
    def __init__(self): 
     self.test1 = 0 
     self.location = {"test1":self.test1} 
     self.row = [self.test1] 
def change(): 
    a = test() #instantiation 
    a.location['test1'] = 1 #Changing a.test1 to 1 within a dictionary 
    print(a.test1) #Print a.test 
    print(a.location['test1']) #Print a.test1 from within the dictionary where it was changed 
    print(a.row) #Print a list also containing a.test1 
change() 

輸出到:

0 #Variable itself is unchanged 
1 #Variable in dictionary is changed 
[0] #Same variable referenced in list is unchanged as well 

爲什麼會出現這種情況,我怎麼可能改變a.test1通過僅在字典改變它等於1?

+1

通過重新分配值,您不會重新分配實際屬性。 –

+0

你似乎認爲在你的類中對'self.test1'的引用以某種方式創建了對實例變量的永久引用。他們不是。這些引用相當於只使用'0'。有了這種理解,行爲現在應該是明顯的。 –

+0

「在Python中無法將變量鏈接到另一個變量」 - 學習Python – 0TTT0

回答

1

發生這種情況是因爲python整數是不可變的。所以,每次你用整數進行任何操作時,它實際上都會創建新的對象,而不是創建指向prevoius對象的指針。這可以easyly illustraded與下面的代碼:

>>> a = 0 
>>> b = a 
>>> b += 1 
>>> a, b 
(0, 1) 

但是,如果你想使用列表,例如,你會得到這樣的事情:

>>> a = [] 
>>> b = a 
>>> b.append(1) 
>>> a, b 
([1], [1]) 

在總結 - 你的代碼的工作,因爲它應該。另外,我建議你試試下面的代碼片段:

class test: 
    def __init__(self): 
     self.test1 = [0] 
     self.location = {"test1": self.test1} 
     self.row = [self.test1] 


def change(): 
    a = test() #instantiation 
    a.location['test1'][0] = 1 #Changing a.test1 to 1 within a dictionary 
    print(a.test1) #Print a.test 
    print(a.location['test1']) #Print a.test1 from within the dictionary where it was changed 
    print(a.row) #Print a list also containing a.test1 

change() 

將產生你:

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

改變什麼self.location [「測試1」]等於不改變自身的價值.test1。

class Test: 
    def __init__(self): 
     self.test1 = 0 
     self.location = {"test1":self.test1} 
     self.row = [self.test1] 


def change(): 
    a = test() 
    a.location['test1'] = a.test1 = 1 
    a.row = [a.test1] 
    print(a.test1) 
    print(a.location['test1']) 
    print(a.row) 


change() 
0

當你指定的值要替換的self.test1參考字典。據我所知,沒有辦法「指向」字典值,或存儲對它的引用。如果有人知道,請賜教。

相關問題