亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python 實例化以后屬性更新問題

python 實例化以后屬性更新問題

函數式編程 2019-05-12 08:57:43
本人剛剛接觸Python,目前使用python3.6,遇到了一點關于類屬性的問題,代碼如下:classA():def__init__(self):self.x=0self.y=0self.z=[self.x,self.y]defadd_one(self):self.x+=1#self.z=[self.x,self.y]a=A()a.add_one()print(a.x)#1print(a.z)#[0,0]問題如下:假設在add_one方法里面沒有self.z=[self.x,self.y]這段代碼,可以發現雖然x是更新了,但是z并沒有隨著x的更新而更新,除非手動加上這段代碼才可以實現更新,請問這是為什么?另外請教一下有沒有其他可以更加簡便的方法進行對屬性的更新?因為目前這種代碼更新起來很麻煩,增加一個更新方法就需要將所有被更新的屬性手動更新一次愿有前輩能指點一下,若有表述不當,請見諒!
查看完整描述

2 回答

?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

用@property將函數包裝為屬性
python3
>>>classA():
def__init__(self):
self.x=0
self.y=0
@property#將函數包裝為屬性
defz(self):
return[self.x,self.y]
defadd_one(self):
self.x+=1
>>>a=A()
>>>a.add_one()
>>>a.x
1
>>>a.z
[1,0]
>>>
                            
查看完整回答
反對 回復 2019-05-12
?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

因為你直接修改了self.x的整個引用。self.x+=1的操作是將self.x的指向從原先指向的值改為指向另一個值,而不是將其所指向的值修改為另一個值,而self.z仍然存儲著原先self.x指向的舊的值,當然不會跟著更新。要達到你想要的類似的效果,可以試試
a=[]
b=[]
c=[a,b]
print(c)
a.append(1)
b.append(2)
print(c)
與實例化與否無關。
上述代碼對a和b指向的值本身進行了修改,而非修改整個引用使其指向新的值。也就是說,修改后的a和b的指向并沒有改變(而self.x+=1修改了self.x的指向),因此c的兩個元素仍能通過其引用找到與當前a和b一致的值
                            
查看完整回答
反對 回復 2019-05-12
  • 2 回答
  • 0 關注
  • 619 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號