从上一个函数中保留的函数参数的默认值

2024-05-11 03:20:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到python中有一个奇怪的行为,有人能告诉我这种行为的原因吗?你知道吗

如果我调用一个没有属性的函数,那么默认值是保留其状态。为了更好地理解,您可以查看以下示例

class EvenStream(object):
    def __init__(self):
        self.current = 0

    def get_next(self):
        to_return = self.current
        self.current += 2
        return to_return


class OddStream(object):
    def __init__(self):
        self.current = 1

    def get_next(self):
        to_return = self.current
        self.current += 2
        return to_return


def print_from_stream(n, stream=EvenStream()):
    for _ in range(n):
        print(stream.get_next())


print_from_stream(2)
print('*****')
print_from_stream(2)
print('*****')
print_from_stream(2, OddStream())
print('*****')
print_from_stream(2, OddStream())

输出: 我原以为是0,2,0,2,但结果是0,2,4,6

0
2
*****
4
6
*****
1
3
*****
1
3

Tags: tofromselfstreamgetreturnobjectinit
1条回答
网友
1楼 · 发布于 2024-05-11 03:20:32

发生什么事了?你知道吗

当python看到

def print_from_stream(n, stream=EvenStream()):

它将EvenStream()作为默认参数进行计算。这是一个明确的目标。每次使用默认参数调用print_from_stream时,它都使用第一次计算EvenStream()时创建的相同实例。print_from_stream现在有一个关联的对象default_stream。此对象从不使用新的EvenStream更新。在C++ LIGO中,您创建了一个^ {< CD7> }变量。你知道吗

修复

使print_from_stream的默认参数类似于None。然后,添加

if stream is None:
    stream = EvenStream()

最重要的是。这将在每次使用默认参数调用函数时生成EvenStream()的新实例化。你知道吗

请注意,它与以前略有不同,因为print_from_stream(10, None)现在可以工作并提供偶数,而不是崩溃。这在Python中仍然被认为是一种良好的实践,类似于在JS函数中传递undefined与没有给出任何参数是一样的。它允许用户跳过第二个参数,也可以转到第三个参数,如果他们不想命名参数的话。你知道吗

相关问题 更多 >