我注意到 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 中仍然被接受为良好实践,类似于传入undefined
JS 函数就像不提供任何参数一样。如果用户不想命名他们的参数,它也允许用户跳过第二个参数进入第三个参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句