我不知道爲什麼這麼多評論上面包含正確的答案,沒有人敢寫一個實際的答案,所以我會做到這一點。
class ThisWorksNow(object):
def outer(self):
acc = []
def inner(msg):
acc.append(msg)
inner("Why doesn't")
inner(" this work?")
print "".join(acc)
ThisWorksNow().outer()
有什麼區別?
爲封閉對象指定名稱在Python 2.x中不起作用,因爲缺少Py3關鍵字nonlocal
,所以我們必須找到解決方法。
如果我們必須保持名稱到對象的綁定常量,我們必須改變別的東西。在這種情況下,它是我們添加要添加的內容的對象。
print
行不是很優雅;也許打印連接內容的對象可能更適合。
class StringBuilder(list): # class name stolen from Java
def __str__(self):
"""this makes the object printable in a way which represents the concatenated string"""
return "".join(self)
@property
def string(self):
"""this gives us a property which represents the concatenated string"""
return "".join(self)
# use whatever suits you better, one or both
有了這個,我們可以這樣做:
class ThisWorksNow(object):
def outer(self):
acc = StringBuilder()
def inner(msg):
acc.append(msg)
inner("Why doesn't")
inner(" this work?")
print acc
print acc.string # depending on what you take above
ThisWorksNow().outer()
編輯(追加):爲什麼global
不行?
我們也可以通過global
來實現這一點,其中2個缺點。
acc
將不得不作出全球在這兩個地方,我們用它
class WhyDoesntThisWork(object):
def outer(self):
global acc
acc = ''
def inner(msg):
global acc
acc = acc + msg
在此,我們「提升」兩acc
事件爲「global
」的水平。
acc
可以從外面修改。
如果我們在其他地方做global acc
,或者我們在模塊級使用acc
,我們的過程可能會被篡改。這應該避免。
'global'不適用於關閉。你需要python 3中的'nonlocal'。 –
改用mutable(沒有全局關鍵字); 'acc = []','acc.append'等 –
好的,所以使用可變('acc = []')的作品。你能解釋爲什麼那麼重要......只是爲了稍後的瑣事? – sholsapp