2011-11-18 53 views
1

我有更新python類中的屬性的問題,我舉一個小例子。Python類中的屬性

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
class myClass(): 
    def __init__(self): 
     self.s=0 
     self.procedure() 
    def procedure(self):#{{{ 
     s=self.s 
     print s 
     self.operation() 
     print s 
    def operation(self):#{{{                        
     s=self.s 
     s+=1 
     self.s=s 
     print "o:",self.s 
c=myClass() 

然後輸出

0 
o: 1 
0 

爲什麼最後一個數字爲0而不是1?

回答

1

procedure代碼應爲:

def procedure(self):#{{{ 
     s=self.s 
     print s 
     self.operation() 
     # the following line is edited 
     print self.s 

否則,你改變的變量(self.s)不打印。

1

您正在打印s而不是最後一次打印中的self.s。

+0

's = self.s#但s是self.s' – JuanPablo

+0

@JuanPablo但只有'self.s'被設置爲別的東西。 – glglgl

+0

@JuanPablo不,不是的。原來's'和'self.s'是同一個對象的兩個名字。但是,然後你改變'self.s'這個對象的名字,而不用改變's'作爲名字的對象。 –

2

myClass.procedure(),你從self.s複製的值,這是0創建本地名稱s。在myClass.operation()中,您將self.s設置爲1。但是您沒有覆蓋您以前的副本smyClass.procedure(),所以它仍然是0

1

因爲s = self.s不會使s的另一個名稱爲「無論您通過檢查self.s,總是和永遠」;它使s的另一個名稱爲「無論self.s當前所指的是什麼」。

整數0是一個對象。在第一個函數中,導致self.ss都引用該對象,然後使self.s通過另一個s引用另一個其他函數(加法結果)的其他函數。第一個功能的本地s未更改。