V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
MrGba2z
V2EX  ›  问与答

问一个关于 Python 模块导入的问题

  •  
  •   MrGba2z · 2015-08-27 23:01:33 +08:00 · 1550 次点击
    这是一个创建于 3377 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如在我的程序中
    from other import do_sth

    在 other.do_sth 中
    有类似于
    ```
    a = 0
    def do_sth ():
    global a
    a = 2
    ```
    那么如果我要在我的程序中用到 a 和 do_sth , 如何使用才能正确获得被 do_sth 修改过的 a 值?

    我试过了:
    1. from other import do_sth, a
    2. from other import do_sth
    a = 0 (本地定义了一个不在任何 block 之内的 a ,所谓的全局?)

    都没有用。。。
    前提是不改变other的情况下


    类似于
    test1.py
    =========
    a = 2
    def app ():
    global a
    a = a + 1
    return
    =========
    test2.py
    =========
    from test1 import app, a

    print a
    app
    print a
    =========
    11 条回复    2015-08-28 00:31:43 +08:00
    adrianzhang
        1
    adrianzhang  
       2015-08-27 23:08:57 +08:00
    file 1:
    from other import do_sth
    a = 0
    do_sth (a )

    file other:
    def do_sth (b ):
    b = 2
    return b
    MrGba2z
        2
    MrGba2z  
    OP
       2015-08-27 23:11:00 +08:00
    @adrianzhang

    主要是 do_sth ()没有传入参数。。
    xingzhi
        3
    xingzhi  
       2015-08-27 23:17:11 +08:00
    Python 中的变量存放的是对象引用,由于 a 是不可变对象,再执行 a = a+1 后,引用地址已经改变了,而 test2.py 里 import 的 a 对象是改变之前的地址,你可以分别执行一下 id (a ) 就明白了。

    如果把 a 换成 list 这中可变对象的话,执行 a.append (xx ), 就能达到你所要的效果。

    另外,针对这样的情况,你可以通过函数来操作,不直接 import 全局变量,而是通过函数来获取该全局变量的值。
    MrGba2z
        5
    MrGba2z  
    OP
       2015-08-27 23:36:44 +08:00
    @xingzhi
    我改成
    test1

    a = 2
    def app ():
    global a
    a = a + 1
    return
    def avalue ():
    global a
    return a

    test2
    from test1 import app, avalue
    app
    print avalue ()

    还是没用。。请问通过函数来获取是指?
    MrGba2z
        6
    MrGba2z  
    OP
       2015-08-27 23:37:15 +08:00
    @adrianzhang
    我上学期选了 lisp 。。然后就因为看了这篇文章把 lisp 的课退了
    adrianzhang
        7
    adrianzhang  
       2015-08-27 23:45:00 +08:00
    @MrGba2z 那个文章里有一个关于比较各个语言优劣的 case , 这个 case 就是做一个累加器。有 python 实现的说明,看看是否是你要的。
    octopus_new
        8
    octopus_new  
       2015-08-28 00:08:33 +08:00
    @MrGba2z 如果只是为了获取改变后的 value ,为什么不能用:
    from test1 import app, a
    print (a )
    a = app ()
    print (a )

    在我的理解里, app ()虽然看上去修改了 a 的 value ,但是实际上修改的是 app.a. 你在一直尝试获取的值一直都没变,即使你家上 global 关键字
    xingzhi
        9
    xingzhi  
       2015-08-28 00:18:59 +08:00   ❤️ 1
    @MrGba2z
    就是你写的那样,定义一个获取全局变量的函数。

    test2
    from test1 import app, avalue
    app
    print avalue ()

    这里有个错误,你需要执行 app 函数,应该改为 app () 再 print avalue ()
    octopus_new
        10
    octopus_new  
       2015-08-28 00:20:34 +08:00
    @MrGba2z 你可以把 avalue 修改一下:
    def avalue ():
    print (app ())

    这样就可以获得修改后的 a 的 value 了,实际上就是获得修改后的 a 的地址的值
    MrGba2z
        11
    MrGba2z  
    OP
       2015-08-28 00:31:43 +08:00
    @xingzhi
    确实忘记括号了
    加上后能正常使用了

    感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5635 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:49 · PVG 14:49 · LAX 22:49 · JFK 01:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.