我有三个文件:bar.py
,foo.py
和main.py
。
# bar.py
import numpy as np
global y
x=0
y=0
z=np.array([0])
# foo.py
from bar import *
def foo():
x=1
y=1
z[0]=1
# main.py
from foo import *
from bar import *
print(x,y,z)
# 0 0 [0]
foo()
print(x,y,z)
# 0 0 [1]
问题:为什么x
和y
在z
更改其元素值时未更改其值?而且,我应该如何编写以便我可以更改x
和y
的值,这些值也可以从其他文件中访问?
通常情况下,我从不以这种方式写作,这在将古老的FORTRAN77
程序翻译成python
时被强制执行。
原始代码大量使用公共块和包含,所以基本上我无法跟踪所有变量的声明。但我仍然希望保留代码的原始样式,所以我尝试制作一个"全局变量模块",其变量可以从程序的任何部分进行修改。
回到我的问题,我的猜测是numpy.ndarray
只是指针,我们不会改变指针的值,所以z
已经改变了。但即便如此,z
的行为似乎也非常危险,我不能相信z
作为全局变量共享,并且它的值在所有文件中都是相同的。谁知道z
和main
中的foo
指向相同的内存扇区?
此外,我如何才能使一些变量真正全球?实际上,当我尝试翻译FORTRAN程序时,我尝试创建它们的类和实例,然后将实例传递给函数的参数,然后我意识到需要极大地修改代码。
我该怎么办?
答案 0 :(得分:0)
您导入了变量并使用了本地副本。 x
和y
是整数,不可变类型,因此在本地分配。但是,当您使用z
时,您已达到可变类型并更改其元素。
如果要更改包变量(在原始包中),则需要导入包本身并更改这些值:
# foo.py
# from bar import *
import bar
def foo():
bar.x=1
bar.y=1
bar.z[0]=1
# main.py
from foo import *
import bar
print(bar.x,bar.y,bar.z)
# 0 0 [0]
foo()
print(bar.x,bar.y,bar.z)
# 0 0 [1]
输出:
0 0 [0]
1 1 [1]