在python中声明全局动态变量
我是python/编程新手,可能我的问题毫无意义 我的问题是,如果一个变量是动态的,我就不能使它成为全局变量,我的意思是我可以这样做:在python中声明全局动态变量,python,Python,我是python/编程新手,可能我的问题毫无意义 我的问题是,如果一个变量是动态的,我就不能使它成为全局变量,我的意思是我可以这样做: def creatingShotInstance(): import movieClass BrokenCristals = movieClass.shot() global BrokenCristals #here I declare BrokenCristals like a global variable and it work
def creatingShotInstance():
import movieClass
BrokenCristals = movieClass.shot()
global BrokenCristals #here I declare BrokenCristals like a global variable and it works, I have access to this variable (that is a shot class instance) from any part of my script.
BrokenCristals.set_name('BrokenCristals')
BrokenCristals.set_description('Both characters goes through a big glass\nand break it')
BrokenCristals.set_length(500)
Fight._shots.append(BrokenCristals)
def accesingShotInstance():
import movieClass
return BrokenCristals.get_name()#it returns me 'BrokenCristals'
但如果我不这样做,而是声明一个字符串变量,如下所示:
def creatingShotInstance():
import movieClass
a = 'BrokenCristals'
vars()[a] = movieClass.shot()
global a #this line is the only line that is not working now, I do not have acces to BrokenCristals class instance from other method, but I do have in the same method.
eval(a+".set_name('"+a+"')")
eval(a+".set_description('Both characters goes through a big glass\nand break it')")
eval(a+".set_length(500)")
Fight._shots.append(vars()[a])
def accesingShotInstance():
import movieClass
return BrokenCristals.get_name()#it returns me 'BrokenCristals is not defined'
我试过这个:
global vars()[a]
这是:
global eval(a)
但这给了我一个错误。我该怎么办?全局关键字指定在一个作用域中使用的变量实际上属于外部作用域。因为在您的示例中没有嵌套的作用域,所以global不知道您要做什么。请参见使用dict代替动态全局变量:
movies = {}
a = 'BrokenCristals'
movies[a] = movieClass.shot()
movies[a].set_name(a)
# etc
为了完整起见,这里是对您最初问题的答案。但这几乎肯定不是你想要做的——在很少的情况下,修改作用域的
dict
是正确的做法
globals()[a] = 'whatever'
你的代码运行良好!
这只是一个拼写错误和缺少括号!
第一个语法错误没有方括号:
File "main.py", line 6
global BrokenCristals
^
SyntaxError: name 'BrokenCristals' is assigned to before global declaration
第二个语法错误全局字符末尾没有字母s:
File "main.py", line 6
global [BrokenCristals]
^
SyntaxError: invalid syntax
更正语法:
使用声明的字符串更正了语法:
接受暗示。不要这样做。从长远来看,有一个“动态”变量是没有意义的。你为什么会想要这样的东西?aaronasterling不是一个笑话(无论如何感谢你的好意评论)。我正在尝试创建一个类实例,其名称来自UI中的一个条目,因此该名称是一个动态变量。然后Ned Batchelder为你解决了这个问题。除非您需要一个准奇妙的元类,它根据电影的名称注册实例,并提供一个实现fly-weight模式的构造函数。Ned的解决方案几乎肯定更好。记住
global a
处理一个名为“a”的全局变量<代码>全局a变成全局('a')
,而不是全局(a)
,如果你明白我的意思(不是说全局是一个函数-全局(a)
),如果变量,包括它的名字都是动态的,你怎么能把它硬编码成函数呢?如果要使用全局变量,请给它一个不变的全局名称,并使其成为某种容器对象,如字典或类实例,并在其中存储所需的任何数据。顺便说一句,建议不要修改字典vars()
returns。很抱歉,它似乎不起作用……我仍然收到这样一条消息:name'brokenistal,未定义这在Python 2.7中实际上对我不起作用。它似乎修改了全局变量,但当我离开作用域时,全局变量恢复到以前的状态。谢谢,它实际上适用于Python 2.7.17,至少我可以pickle和unpickle namedtuple,它是在其他模块中动态创建的(我将其添加到了全局变量)。很抱歉,我仍然有同样的问题,当我尝试从任何其他方法从BrokenCristals快照类实例中获取值时,我会收到以下消息:未定义名称“BrokenCristals”……有什么想法吗?请尝试movies['BrokenCristals']。例如,获取\u name()
。您没有名为BrokenCristals的变量。你有一个名为《电影》的dict,上面有一个'BrokenCristals'
键。非常感谢你的回答和对我这样的新手的耐心:-D
def creatingShotInstance():
import movieClass
BrokenCristals = movieClass.shot()
globals [BrokenCristals]
BrokenCristals.set_name('BrokenCristals')
BrokenCristals.set_description('Both characters goes through a big glass\nand break it')
BrokenCristals.set_length(500)
Fight._shots.append(BrokenCristals)
def accesingShotInstance():
import movieClass
return BrokenCristals.get_name()
def creatingShotInstance():
import movieClass
a = 'BrokenCristals'
vars()[a] = movieClass.shot()
globals [a]
eval(a+".set_name('"+a+"')")
eval(a+".set_description('Both characters goes through a big glass\nand break it')")
eval(a+".set_length(500)")
Fight._shots.append(vars()[a])
def accesingShotInstance():
import movieClass
return BrokenCristals.get_name()