2016-11-15 42 views
0

我想了解類變量和init之間的差異。我明白,類變量通常是靜態的,可以改變。Python類與實例變量|整數/列表

我想知道爲什麼當你打印變量賬戶後,它被Sam的實例改變了,它已經改變了David。

但是,無論何時你更新Sam的餘額,它都不會改變爲David。謝謝。

class BankAccount: 
    Balance = 0 
    Accounts = [] 

Sam = BankAccount() 
David = BankAccount() 

print("Sam's Balance", Sam.Balance) 
print("David's Balance", David.Balance) 
print("") 
print("Sam's Accounts", Sam.Accounts) 
print("David's Accounts", David.Accounts) 


Sam.Balance = 1000 
Sam.Accounts.append("Sam's Personal Checking") 

print("Sam's Balance", Sam.Balance) 
print("David's Balance", David.Balance) 
print("") 
print("Sam's Accounts", Sam.Accounts) 
print("David's Accounts", David.Accounts) 
+2

您正在綁定一個新的變量'Sam.Balance',它將'BankAccount.Balance'與'append()'隱藏到現有列表中。即使'Sam.Balance + = 1000'仍然會隱藏'BankAccount.Balance',因爲'int'不可變。 – AChampion

+0

使用'Sam.Balance = 1000',您正在創建新的實例變量。 –

+0

當我在類中添加一個打印函數來打印全局變量平衡和self.Balance它們是相同的嗎?我對這部分有點困惑。 – Davidhall

回答

0

爲了說明給出的答案:您可以使用id()is運算符來檢查對象是否是相同的東西。

>>> class BankAccount: 
    Balance = 0 
    Accounts = [] 


>>> a = BankAccount() 
>>> b = BankAccount() 
>>> id(BankAccount.Balance), id(a.Balance), id(b.Balance) 
(507102960, 507102960, 507102960) 
>>> BankAccount.Balance is a.Balance is b.Balance 
True 
>>> BankAccount.Accounts is a.Accounts is b.Accounts 
True 
>>> b.Balance = 2 
>>> id(BankAccount.Balance), id(a.Balance), id(b.Balance) 
(507102960, 507102960, 507103024) 
>>> BankAccount.Balance is a.Balance is b.Balance 
False 
>>> a.Accounts.append(2) 
>>> BankAccount.Accounts is a.Accounts is b.Accounts 
True 
>>> 

Naming and Binding是一個很好的閱讀。 和Classes section of the Tutorial可能提供洞察力。

+0

非常感謝你這是一個很好的例子,哈哈,我很難將自己的頭腦置於完全不同的地方。我一直在嘗試閱讀很多關於針織和類變量之間的區別。 @wwii – Davidhall

1
每當你分配一個屬性的實例

,它成爲一個實例變量(不通過任何其他實例共享),即使它之前是一個類變量。這是Sam.Balance = 1000的情況。但是,Sam.Accounts.append("Sam's Personal Checking")是完全不同的情況 - 您沒有分配任何內容,帳戶列表與之前的對象完全相同,仍然是類變量。您只需更改該列表的內容,無論您如何檢索列表,該內容都是可見的。

0

Python中的整數不可變,所以當Sam.Balance = 1000時,這會將實例變量Balance添加到實例Sam,而不會更改類變量。

+0

類的BankAccount: \t結餘= 0 \t高清PrintSelf(個體經營): \t \t嘗試: \t \t \t打印(self.Balance) \t \t情況除外: \t \t \t打印(「我有挑剔發現自己還「) \t \t打印(餘額) \t 薩姆=的BankAccount() Sam.Balance = 1000 Sam.PrintSelf() – Davidhall

+0

我在我的iPad上,所以返回自動讓我這樣做。爲什麼在上面的代碼中,如果不改變類變量,Balance == 1000?非常感謝你們的幫助! @whbb – Davidhall