【问题标题】:Functions and global scope/nested function confusion in pythonpython中的函数和全局范围/嵌套函数混淆
【发布时间】:2017-04-26 01:28:18
【问题描述】:
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) 当我打印冰箱时,我得到了未经编辑的原始列表。我什至尝试制作冰箱的副本,然后尝试在函数之外打印该值,但最终结果是相同的:原始冰箱字典没有修改。

【问题讨论】:

    标签: python function dictionary scope global


    【解决方案1】:

    您将fridge 作为参数传入,因此它将是一个局部变量。要使用全局 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}
    

    【讨论】:

    • 您说“全局变量通常是大写的”,例如 FRIDGE。这纯粹是为了提高可见性/可读性的美学约定,还是代码的实际要求?
    • 是的,根据 PEP8(python 风格指南):python.org/dev/peps/pep-0008
    • PEP8 中的约定是对常量使用全大写,而不是全局。
    • @Stuart 似乎在技术上是正确的(这是最好的正确方式),但是pylint 要求所有全局变量都是大写的,我认为大多数人都对所有全局变量使用大写。
    【解决方案2】:

    为了进一步说明,请注意以下任一方法都可以:

    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)
    

    在大多数情况下,第一个被认为是更好的编程风格,如global variables are usually best avoided

    【讨论】:

      【解决方案3】:

      你还没有用 fridge

      调用函数 fridge_function

      这应该可行:

      fridge_function(fridge)
      print (fridge)
      

      【讨论】:

      • 而且函数不需要return语句:)
      • 我认为所有需要返回的函数都作为其语法的一部分......? :O
      • 其实Python中的所有函数都会返回一些东西...如果省略return语句,函数默认返回None ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 2014-04-14
      • 1970-01-01
      相关资源
      最近更新 更多