先前函数调用保留的函数参数中的默认值

阿尔戈

我注意到 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
尼古拉斯·皮皮托内

发生了什么?

当蟒蛇看到

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

它评估EvenStream()为默认参数。这是一个明确的对象。每次print_from_stream使用默认参数调用时,它都会使用EvenStream()第一次评估时创建的相同实例print_from_stream现在有一个关联的对象default_stream此对象永远不会用新的EvenStream. 在 C++ 行话中,您已经创建了一个static变量。

修复

将默认参数设为print_from_stream类似None. 然后加

if stream is None:
    stream = EvenStream()

到您的功能的顶部。这将在EvenStream()每次使用默认参数调用函数时进行新实例化

请注意,它与以前略有不同,print_from_stream(10, None)现在可以工作并提供偶数,而不是崩溃。这在 Python 中仍然被接受为良好实践,类似于传入undefinedJS 函数就像不提供任何参数一样。如果用户不想命名他们的参数,它也允许用户跳过第二个参数进入第三个参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在另一个带有点参数和默认值的函数中调用带有点参数和默认值的函数

来自分类Dev

在JS中调用函数时省略/跳过具有默认值的参数

来自分类Dev

是否在每个函数调用中评估可选参数的默认值?

来自分类Dev

函数中的默认值

来自分类Dev

Scala中参数中函数的默认值

来自分类Dev

从修改默认值的函数调用具有不同默认参数的多个函数

来自分类Dev

如何为函数中的矢量参数提供默认值

来自分类Dev

C ++构造函数中参数的默认值

来自分类Dev

Swift函数中可选通用参数的默认值

来自分类Dev

Kotlin中lambda函数的参数的默认值

来自分类Dev

在函数中设置List <string>类型的参数的默认值

来自分类Dev

C ++构造函数中参数的默认值

来自分类Dev

函数参数Python的多个默认值

来自分类Dev

修改函数参数的默认值

来自分类Dev

用于函数的可选参数的默认值

来自分类Dev

如何访问函数参数的默认值?

来自分类Dev

函数作为参数的默认值

来自分类Dev

JavaScript函数作为函数参数的默认值

来自分类Dev

在构造函数中传递默认值

来自分类Dev

列默认值中的MySQL函数

来自分类Dev

更改内置函数中的默认值

来自分类Dev

MariaDB 中 LAG 函数的默认值

来自分类Dev

倍频程错误:调用函数时参数1没有默认值

来自分类Dev

函数中的本地字符数组保留其先前调用中的值

来自分类Dev

以其他参数为默认值的函数参数

来自分类Dev

函数参数的默认值,其中传入的值为nil

来自分类Dev

Swift:使用参数作为同一函数中不同参数的默认值

来自分类Dev

PHP 函数中参数默认值的特殊“未定义”值

来自分类Dev

函数等于Scala中函数的默认值

Related 相关文章

热门标签

归档