Python中的eval函數的求值

來源:互聯網
上載者:User

程式員對python的eval()內建函數褒貶不一,我在使用eval函數時 發現了這樣的問題:

>>> class Foo:<br />... val = 1<br />... </p><p>>>> foo = Foo()<br />>>> foo.val<br />1<br />>>> eval_foo = eval("foo")<br />>>> eval_foo<br /><__main__.Foo instance at 0x01C48080><br />>>> eval_foo.val = 10000<br />>>> foo.val<br />10000<br /> 

而不用類的時候,傳遞的是值.

>>> a = 1<br />>>> b = eval("a")<br />>>> b<br />1<br />>>> b = 10000<br />>>> b<br />10000<br />>>> a<br />1<br /> 

以為int long float str這些類型是靜態(定長)類型 在python給這些變數賦值時,在記憶體中也分配了確定的空間,在重新賦值後,如上面的b=10000時,其實b已經變成了另外的一個int對象..

但是如果用類的話,只是相當於獲得了一個引用,所以foo eval_foo指向的是同一個對象,當然屬性是一樣的,一個改變另一個也會改變.

其實後來發現 這個 特性其實和eval無關..囧,,

 

如果不想獲得一個引用 那麼我們就要用到拷貝,包括淺拷貝(copy模組的copy函數)和深拷貝(copy模組中的deepcopy函數).

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.