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

2015-08-27 23:01:33 +08:00
 MrGba2z
比如在我的程序中
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
=========
1548 次点击
所在节点    问与答
11 条回复
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
2015-08-27 23:11:00 +08:00
@adrianzhang

主要是 do_sth ()没有传入参数。。
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 全局变量,而是通过函数来获取该全局变量的值。
adrianzhang
2015-08-27 23:22:59 +08:00
MrGba2z
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
2015-08-27 23:37:15 +08:00
@adrianzhang
我上学期选了 lisp 。。然后就因为看了这篇文章把 lisp 的课退了
adrianzhang
2015-08-27 23:45:00 +08:00
@MrGba2z 那个文章里有一个关于比较各个语言优劣的 case , 这个 case 就是做一个累加器。有 python 实现的说明,看看是否是你要的。
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
2015-08-28 00:18:59 +08:00
@MrGba2z
就是你写的那样,定义一个获取全局变量的函数。

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

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

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

感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/216539

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX