繁体   English   中英

使用字典来引用函数内的全局变量(Python)

[英]Use a dictionary to refer to a global variable inside a function (Python)

我正在使用字典在函数内引用 Python 中的全局变量。 我想使用该函数来更新全局变量。 (实际上我的全局变量比这更复杂。)

global_variable_A=5
global_variable_B=1
dictionary={'A':global_variable_A,'B':global_variable_B}

def f(x,glob):
    global global_variable_A
    dictionary[glob]+=x

f(2,'A')
print(global_variable_A)

这返回 5 而不是 7。我明白为什么,无论如何让 Python 知道我的意思是变量dictionary[glob]指的是全局变量而不是局部变量,同时仍然通过字典来指代变量?

感谢您的时间,如果我错过了一些完全明显的东西,我深表歉意。

如果您认为需要这样做,则说明您的代码存在设计缺陷。 我真的不建议这样做。

global_a = 5

def add_to_global(key, value):
    globals()[key] += value

add_to_global("global_a", 2)
print(global_a)

输出:

7

当您为名称name = 5分配值时,您正在创建对5的引用,您可以使用标识符name访问该引用。 通常,如果您有一些范围更窄的代码,您可以使用该引用

def f():
    print(name)

或使用相同的标识符创建本地引用,可能指向不相关的值

def g():
    name = 100
    print(name)

global关键字允许您像操作标识符一样操作标识符;不在更窄的范围内,允许您将全局名称重新分配给不同的引用:

def h():
    global name
    name = 100

h()
print(name) # 100

但是,当您使用一个引用创建另一个引用时,这两个引用之间没有任何关系。 所以

name = 5
l = [name]

给我们留下了两个对值5引用:一个来自标识符name ,另一个来自l的第一个位置。 至关重要的是,这两个参考文献并不相关。 我们可以改变一个而不改变另一个。

name = 6
print(l)  # [5]

实现您想要的一种方法是使用盒装类型。 这意味着您创建了一个指向另一个对象的对象。 然后,您的所有引用都可以指向第一个对象(盒子),并且您可以自由地更改它指向的内容(盒子“内部”的东西),只需更新一个引用:

class Box:
    def __init__(self, value):
        self.value = value

box = Box(5)
l = [box]
box.value = 10
print(l[0].value)  # 10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM