首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用字典引用函数内的全局变量(Python)

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

Stack Overflow用户
提问于 2020-01-28 00:01:37
回答 2查看 183关注 0票数 0

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

代码语言:javascript
运行
复制
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]引用全局变量而不是局部变量,同时仍然通过字典引用该变量?

感谢您的宝贵时间,如果我遗漏了一些显而易见的东西,我深表歉意。

EN

回答 2

Stack Overflow用户

发布于 2020-01-28 00:20:22

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

代码语言:javascript
运行
复制
def f():
    print(name)

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

代码语言:javascript
运行
复制
def g():
    name = 100
    print(name)

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

代码语言:javascript
运行
复制
def h():
    global name
    name = 100

h()
print(name) # 100

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

代码语言:javascript
运行
复制
name = 5
l = [name]

向我们提供了两个对值5的引用:一个来自标识符name,另一个来自l的第一个位置。至关重要的是,这两个引用是不相关的;我们可以在不更改另一个的情况下更改其中一个。

代码语言:javascript
运行
复制
name = 6
print(l)  # [5]

实现所需功能的一种方法是使用盒装类型。这意味着您创建了一个指向另一个对象的对象。然后,所有的引用都可以指向第一个对象(框),并且只需更新一个引用,就可以自由地更改它所指向的对象(框中的对象):

代码语言:javascript
运行
复制
class Box:
    def __init__(self, value):
        self.value = value

box = Box(5)
l = [box]
box.value = 10
print(l[0].value)  # 10
票数 1
EN

Stack Overflow用户

发布于 2020-01-28 00:07:47

如果您认为您需要这样做,那么您的代码中存在设计缺陷。我真的不推荐这样做。

代码语言:javascript
运行
复制
global_a = 5

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

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

输出:

代码语言:javascript
运行
复制
7
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59934705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档