来自C ++并尝试学习Python,我遇到了可怕的可变默认参数问题。
_source
我知道列表的长度越来越长,这是因为L在函数定义期间(而不是在执行期间)仅被声明一次,并且L指向可变对象。
我不明白的是上述问题的解决方案是如何工作的:
<script>
function GetFileSize() {
var fi = document.getElementById('file'); // GET THE FILE INPUT.
// VALIDATE OR CHECK IF ANY FILE IS SELECTED.
if (fi.files.length > 0) {
// RUN A LOOP TO CHECK EACH SELECTED FILE.
for (var i = 0; i <= fi.files.length - 1; i++) {
var fsize = fi.files.item(i).size; // THE SIZE OF THE FILE.
document.getElementById('fp').innerHTML =
document.getElementById('fp').innerHTML + '<br /> ' +
'<b>' + Math.round((fsize / 1024)) + '</b> KB';
}
}
}
我不明白的原因是,为什么在第一次调用该函数后,L不会指向值为[1]的类型为list的对象。
听我说:
def func(L=[]):
L.append(1)
print(L)
在第二次迭代中,由于不再要声明L,所以L仍应指向值为[1]的List类型的对象。
我想念什么?
是因为L是不可变的,Python创建了一个指向空列表的新变量L,该空列表在函数返回并且垃圾收集器将None类型的L识别为默认参数之后被销毁,结果,不是“杀死”它吗?
非常感谢您提供任何类型的帮助。 亚历山德罗