如何在Python中使用外部变量,例如C中的extern int x;
?
例如,
main1.py:
from myfunc import print_a
a = 10
print a
print_a()
myfunc.py:
def print_a():
global a
print a
答案 0 :(得分:8)
只需在模块中重新分配变量:
import myfunc
from myfunc import print_a
a = 10
print a
myfunc.a = a
print_a()
否则无法实现。
记得python以与C完全不同的方式处理模块。
python中的import
不“复制该位置文件的内容”,
但它执行给定文件中的代码并创建一个module
对象。
模块的全局变量是module
对象属性,可以像我所示进行修改。除了内置插件之外,没有“全局变量”这样的概念。
我建议重构您的代码,使您根本无需修改此全局变量,将使用myfunc.a
的代码从main1
移至myfunc
}。
您需要这样的全局变量的事实已经是代码味道,您的代码有问题,您应该尝试修复它。
实际上有一种方法可以影响“全球范围”,但实在是太疯狂了,我甚至都不想提及它。相信我:你不想使用它。如果人们使用这样的黑客看到你的代码,你可能会处于身体危险之中。
答案 1 :(得分:2)
与C不同,在全局范围内声明的变量仍然在其创建模块的范围内,因此您需要使用其所在的模块来限定名称a
。
当您要通过重新分配修改全局变量时使用global
关键字,当您只是引用全局变量时不需要它。
如果您尝试访问另一个文件的变量,则必须导入该模块,并且由于文件的结构方式,您有几种方法可以解决问题:
选项1)移动函数内myfunc.print_a
的引用和import main1
内myfunc
的引用,以查看a
<强> main1.py 强>
import myfunc
a = 10
def main():
print a
myfunc.print_a()
if __name__ == '__main__':
main()
<强> myfunc.py 强>
import main1
def print_a():
print main1.a
选项2)推荐将变量移动到另一个模块中,同时导入myfunc
和main1
。
<强> vals.py 强>
a = 20
<强> main1.py 强>
import vals
from myfunc import print_a
vals.a = 10
print vals.a
print_a()
<强> myfunc.py 强>
import vals
def print_a():
print vals.a
答案 2 :(得分:0)
这是通过使用公用外部文件解决此问题的方法。在此示例中,我将存储一个索引变量以在每个应用程序中标记是否正在访问文件。 ext1.py中的indxOpen变量和ext2.py中的indxO正在更新并存储在公共外部文本文件“ externalVars.txt”中
潜在客户应用程序ext1.py
# lead application ext1.py
#this alternately flips the value of indxOpen on prime number intervals
import time
def update(d,v1):
f=open(d+'externalVars.txt','r+')
f.write(str( v1))
f.truncate()
f.close()
# ensure variable is initialised and made available to external apps
indxOpen = False
var_dir = "<your external var directory>/"
try:
f =open(var_dir+'externalVars.txt','r')
except:
f= open(var_dir+'externalVars.txt','w')
f.close()
# this alternately flips the value of indxOpen on prime number intervals
update(var_dir,indxOpen)
i = 0
while True:
while indxOpen:
i += 1
if (i % 13) ==0:
indxOpen = indxOpen ^ True
update(var_dir,indxOpen)
f=open(var_dir+'externalVars.txt','r+')
t=f.readline()
print "app1",t," ",i
if t=='False':
print "app1 updated"
update(var_dir,indxOpen)
indxOpen = False
else:
time.sleep(1.4)
while not indxOpen:
f=open(var_dir+"externalVars.txt","r+")
t=f.readline()
print "app1",t
if t=='True':
indxOpen = True
else:
time.sleep(1)
ext2.py以下应用程序
# ext2.py this alternately flips the value of indxO on prime number intervals but it is initialised by the lead application
# in this case ext1.py
# python 2.7.12
import time
def update(d,v1):
f=open(d+'externalVars.txt','r+')
f.write(str( v1))
f.truncate()
f.close()
var_dir = "<your external var directory>/"
# intialise external variable
f=open(var_dir+'externalVars.txt','r+')
t=f.readline()
if t=='True':
indxO= True
if t=='False':
indxO= False
i=0
while True:
while indxO:
f=open(var_dir+"externalVars.txt","r+")
t=f.readline()
print "app2",t
if t=='False':
indxO = False
update(var_dir,indxO)
else:
time.sleep(1.5)
while not indxO:
i += 1
if (i % 17) ==0:
indxO = indxO ^ True
update(var_dir,indxO)
f=open(var_dir+"externalVars.txt","r+")
t=f.readline()
print "app2",t," ",i
if t=='True':
indxO = True
print "apt2 updated"
update(var_dir,indxO)
else:
time.sleep(1.3)