Python eval 函數說明

eval(str [,globals [,locals ]]) -- 函數將字符串str當成有效Python表達式來求值,並返回計算結果。python

例 :  eval('3+4')         ==>  7函數

>>> a = 1
>>> b = eval("a")
>>> id(a)
505910960
>>> id(b)
505910960
>>> b = 1000
>>> id(b)
16834704
>>> a
1

根據eval函數的含義:把1賦值給變量b  ==> 讓b指向1的內存地址     b = 1000 ==>讓b指向1000的內存地址測試

這裏牽涉到一個概念:python的賦值是隻是把變量的內存地址賦值給另外一個變量,這一點能夠使用python的內建方法id()來進行測試spa

咱們假設'QH'這個字符串在內存中的地址是a,'LJQ'在內存中的地址是b
you='QH' #讓you變量指向a地址
me=you #讓me變量和you變量同樣指向a地址
you='LJQ' #修改you變量,讓它指向到b地址
print you #可想而知you指向的是b地址,因此它的值爲'LJQ'
print me #me指向的是a地址,因此它的值爲'QH'
輸出:
LJQ
QH
class Foo:
    val = 1

foo = Foo()
print(foo.val)
==> 1
print(foo)
==> <__main__.Foo object at 0x010153D0>
eval_foo = eval("foo")
print(eval_foo)
==> <__main__.Foo object at 0x010153D0>
eval_foo.val = 1000
print(foo.val)
==> 1000

eval_foo = eval("foo") 將foo對象的地址傳遞給eval_foocode

至關於得到了一個引用,因此foo和eval_foo指向的是同一個對象,固然屬性是同樣的,一個改變另外一個也會改變.對象

若添加 eval_foo = Foo() 將建立一個實體對象,內存的地址將與foo的內存地址不一樣

blog

PS:若是不想得到一個引用 那麼咱們就要用到拷貝,包括淺拷貝(copy模塊的copy函數)和深拷貝(copy模塊中的deepcopy函數)內存

相關文章
相關標籤/搜索