gpt4 book ai didi

Python 函数调用是出血范围、有状态、无法初始化参数?

转载 作者:太空狗 更新时间:2023-10-30 00:20:38 26 4
gpt4 key购买 nike

<分区>

在我厚颜无耻地提交错误报告之前,我想我应该在这里与更聪明的 Pythonist 一起检查我的假设。我今天遇到了一个莫名其妙的案例,所以我将其简化为一个玩具示例,如下所示:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

"""
A little script to demonstrate that a function won't re-initialize its
list parameters between calls, but instead allows them to retain state.

"""

def bleedscope(a=[], b=[]):
"""
On each call, unless explicitly passed, both `a` and `b` should be
initialized as empty lists.

"""

c = a
if b:
c.extend(b)
return len(c)


x = bleedscope(b=[1])
print x # Should be 1, as expected.
x = bleedscope(b=[2])
print x # Expect also to be 1, but it's 2. `a` is retained.
x = bleedscope(a=[1])
print x # Now 1 as expected.
x = bleedscope(b=[3])
print x # 1 as expected? No, it's 3! Insanity!

我认为函数参数在函数范围内是局部的,并且在函数调用结束时被垃圾收集,永远不会保留它们之间的状态。我已经在 Python 2.5.2 和 Python 2.6.1 上测试了上面的脚本,但我的理解不是结果。参数 a 当然会保留大多数这些调用之间的状态;最令人困惑的是对 bleedscope 的最终调用,它跳过前一个调用的状态并返回到第二个调用结束时的状态(即 [1, 2] )。 [我建议在您最喜欢的调试器中运行它以亲自查看。如果你没有,我建议 Winpdb作为可靠的 FOSS 独立 Python 调试器。]

这是怎么回事?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com