gpt4 book ai didi

python - 跨文件的全局变量和 numpy 行为

转载 作者:行者123 更新时间:2023-12-02 08:43:55 24 4
gpt4 key购买 nike

我有三个文件:bar.pyfoo.pymain.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]

问题:为什么xy没有改变它们的值,而z却改变了它的元素的值?而且,我应该如何编写才能更改 xy 的值,这些值也可以从其他文件访问?

通常我不会以这种方式编写,这是在将古老的 FORTRAN77 程序翻译成 python 时被迫的。

原始代码大量使用公共(public) block 和包含,所以基本上我无法跟踪所有变量的声明。但我仍然想保留代码的原始风格,所以我尝试制作一个“全局变量模块”,它的变量可以从程序的任何部分修改。

回到我的问题,我的猜测是 numpy.ndarray 只是指针,我们不改变指针的值,所以 z 已经改变了。但即便如此, z 的行为似乎非常危险,我不能相信 z 作为全局变量共享,并且它的值在所有文件中都是相同的。谁知道main中的zfoo指向同一个内存扇区?

此外,如何使某些变量真正全局?实际上,当我尝试翻译那个 FORTRAN 程序时,我尝试创建它们的类和实例,然后将实例传递给函数的参数,然后我意识到这需要大量修改代码。

我能做什么?

最佳答案

您导入了变量并使用了本地副本。 xy 是整数、不可变类型,因此是本地分配的。但是,当您使用 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]

关于python - 跨文件的全局变量和 numpy 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49433979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com