def a():
mem=['a']
def b():
mem=[]
print(str(mem))
return b
a()()
为什么即使我不在b函数中添加nonlocal mem
,此代码也能正常工作?
谢谢你的帮助。
答案 0 :(得分:2)
您已在mem
内为b
分配了一个空列表对象,因此已定义。打印时查找成功。
请注意,mem
是b
中的本地名称; 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/