zoukankan      html  css  js  c++  java
  • Python eval 函数说明

    eval(str [,globals [,locals ]]) -- 函数将字符串str当成有效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()来进行测试

    我们假设'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_foo

    相当于获得了一个引用,所以foo和eval_foo指向的是同一个对象,当然属性是一样的,一个改变另一个也会改变.

    若添加 eval_foo = Foo() 将创建一个实体对象,内存的地址将与foo的内存地址不同

    PS:如果不想获得一个引用 那么我们就要用到拷贝,包括浅拷贝(copy模块的copy函数)和深拷贝(copy模块中的deepcopy函数)

  • 相关阅读:
    P2176 [USACO14FEB]路障Roadblock
    洛谷 P1187 3D模型
    洛谷 P2777 [AHOI2016初中组]自行车比赛
    洛谷P2896 [USACO08FEB]一起吃饭Eating Together
    洛谷P2983 [USACO10FEB]购买巧克力Chocolate Buying
    洛谷 P2858 [USACO06FEB]奶牛零食Treats for the Cows
    Restaurant
    OR in Matrix
    poj 3321Apple Tree
    Codeforces Round #204 (Div. 2) C. Jeff and Rounding
  • 原文地址:https://www.cnblogs.com/fendou-999/p/3535059.html
Copyright © 2011-2022 走看看