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函数)内存

相关文章
相关标签/搜索