python 中的函数和全局 scope/nested 函数混淆
Functions and global scope/nested function confusion in 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)
print (fridge)
您将 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
作为函数参数:
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。
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)
print (fridge)
您将 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
作为函数参数:
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。