<p>您的更新是有效的解决方案。您可以更新<code>self</code>,因为它是可变的。您不需要<code>global</code>(或者在本例中,<code>nonlocal</code>)声明来访问它。你只需要这些来重新分配变量。在</p>
<p>例如:</p>
<pre><code>def func():
L = []
def inner():
#nonlocal L # Uncomment to work
L = [1,2,3] # Reassign L
inner() # Call the function and attempt to modify L
return L
def func2():
L = []
def inner():
L[:] = [1,2,3] # Mutate L
inner() # Call the function and attempt to modify L
return L
print(func())
print(func2())
</code></pre>
<p>输出:</p>
^{pr2}$
<p>这里有一个完整的工作示例。。。在</p>
<p><strong>测试c</strong></p>
<pre><code>#include <wchar.h>
#define API __declspec(dllexport)
typedef void (*CALLBACK)(const wchar_t*);
API void do_callback(CALLBACK cb)
{
cb(L"one");
cb(L"two");
cb(L"three");
}
</code></pre>
<p><strong>测试.py</strong></p>
<pre><code>from ctypes import *
CALLBACK = CFUNCTYPE(None,c_wchar_p)
class Test:
dll = CDLL('test')
dll.do_callback.argtypes = CALLBACK,
dll.do_callback.restype = None
def __init__(self):
self.count = 0
def get_callback(self):
@CALLBACK
def callback(s):
self.count += 1 # nonlocal, but mutable
print(self.count,s)
return callback
def do(self):
self.dll.do_callback(self.get_callback())
t = Test()
t.do()
</code></pre>
<p>输出:</p>
<pre><code>1 one
2 two
3 three
</code></pre>