Python中的功能和全局范围/嵌套功能混乱


fridge={"cheese":10, "milk":11, "feta":12, "cream":21, "onion":32, "pepper":25} 
def fridge_function (fridge):
    del fridge["feta"]
    return
print (fridge)

我很困惑。

1)我以为字典具有全局范围。

2)我要做的是从字典中删除项目,然后根据适当的方式更新修订的字典,即删除" feta"的值。

3)当我打印冰箱时,我以未经编辑的版本获得了原始列表。我什至尝试制作冰箱的副本,然后尝试在功能之外打印该值,但是最终结果是相同的:原始的冰箱词典没有修改。

您没有使用 fridge fridge

fridge_function fridge_function

这应该有效:

fridge_function(fridge)
print (fridge)

要进一步澄清,请注意,以下任何一个都可以使用:

fridge作为函数参数:

fridge={"cheese":10, "milk":11, "feta":12, "cream":21, "onion":32, "pepper":25} 
def fridge_function(fridge):
    del fridge["feta"]  # reference to fridge passed as a parameter
fridge_function(fridge)
print(fridge)

fridge作为全局变量

fridge={"cheese":10, "milk":11, "feta":12, "cream":21, "onion":32, "pepper":25} 
def fridge_function():
    del fridge["feta"]  # refers to the global fridge 
fridge_function()
print(fridge)

在大多数情况下,第一个被认为是更好的编程样式,因为通常最好避免全局变量。

您将fridge作为参数传递,ergo将是局部变量。要使用全局fridge,您将要做:

FRIDGE = {"cheese": 10, "milk": 11, "feta": 12, "cream": 21, "onion": 32, "pepper": 25}
def fridge_function():
    del FRIDGE["feta"]
fridge_function()   # you need to call it
print(FRIDGE)

Globals通常是上层的,因此我称为变量FRIDGE

如果您需要分配到全局变量(只有这样),则需要添加global语句:

def myfunction():
    global MYGLOBAL
    MYGLOBAL = 42

使用全球群体以及突变全球群体的功能通常不是一个好的解决方案。也许以对象为导向的东西会更好?(Python 2.7语法):

class Fridge(dict):
    def __init__(self, **contents):
        super(Fridge, self).__init__(contents)
def main():
    fridge = Fridge(
        cheese=10,
        milk=11,
        feta=12,
        cream=21,
        onion=32,
        pepper=25
    )
    print fridge
    del fridge['feta']
    print fridge
if __name__ == "__main__":
    main()

输出为

{'cheese': 10, 'pepper': 25, 'feta': 12, 'onion': 32, 'milk': 11, 'cream': 21}
{'cheese': 10, 'pepper': 25, 'onion': 32, 'milk': 11, 'cream': 21}

最新更新