在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

我是python/编程新手,可能我的问题毫无意义

我的问题是,如果一个变量是动态的,我就不能使它成为全局变量,我的意思是我可以这样做:

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()