首页 > 解决方案 > 替换全局变量

问题描述

下面,我想出了人为地将引用 var n2from传递给f2()tog2(x)而不是全局 var ninf()和嵌套的g(). 在这种情况下,还有其他更好的方法来替换全局变量吗?

from random import randint

# global value var
def f():
    global n
    n=0    
    def g(): 
        global n
        if randint(1,100)>50: n+=1    
    for _ in range(100): g()
    print(n)

# local reference var
def f2():
    n2=[0]
    for _ in range(100): g2(n2)
    print(n2[0])    
def g2(x):
    if randint(1,100)>50: x[0]+=1

标签: python

解决方案


简短回答:您试图通过引用传递一个不可变值(整数)并想要更新它。像你正在做的那样将它包装在一个小类,列表或字典中是要走的路。但是,如果您能够稍微修改您的代码,还有其他方法。

更长的答案:(注意:这可能不是您问题的直接答案。)

我知道这是一个人为的例子。但是想想你真正的问题——g2()是否需要知道有一个变量应该作为其调用的一部分进行更新?有没有办法让更新变量的责任属于定义它的责任?f2()定义变量并更新它的那个怎么样?这样,您可以将对该变量的所有更改限制在一个非常小的周长 ( f2()) 内。

在这种情况下,我的方法类似于:

def f2():
    n2 = 0
    for _ in range(100):
        n2 += g2()
    print(n2)

def g2():
    return 1 if randint(1,100)>50 else 0

推荐阅读