为什么我不需要在这种情况下使用非本地?

时间:2014-02-15 19:19:47

标签: python python-3.x

def a():
    mem=['a']
    def b():
      mem=[]                                                                                                    
      print(str(mem))
    return b
a()()

为什么即使我不在b函数中添加nonlocal mem,此代码也能正常工作? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

您已在mem内为b分配了一个空列表对象,因此已定义。打印时查找成功。

请注意,memb中的本地名称; mem中的a本地完全不受影响,这两个名称完全分开。

如果您希望更改a的{​​{1}},则可以将mem中的mem标记为非本地,或者您可以通过更改{来避免分配{1}}直接对象:

b

此处未指定名称mem;而是改变了里面 def a(): mem = ['a'] def b(): mem[:] = [] print(str(mem)) return b a()() 列表中的索引。由于mem中的名称mem没有分配,因此不是本地名称。

这是有效的,因为列表对象本身是可变的;您可以与对象进行交互并更改内容。

答案 1 :(得分:0)

列表是一种可变数据类型,因此如果您将对其的引用传递给方法,该方法将始终修改原始列表,因为只有一个实际列表存在。为避免这种情况,您可以使用 .copy() 方法以不同的名称创建重复列表。

请参阅此链接以供参考: https://www.dataquest.io/blog/tutorial-functions-modify-lists-dictionaries-python/