【问题标题】:Variable (argument) does not re-instantiate [duplicate]变量(参数)不重新实例化[重复]
【发布时间】:2020-07-04 05:47:04
【问题描述】:

我注意到 Python 中的以下行为:

>>> class foo:
...     def __init__(self, x=0):
...             self.x = x
...     def bar(self):
...             self.x = self.x + 1
... 
>>> def f(a=foo()):
...     a.bar()
...     return a
... 
>>> c = f()
>>> c.x
1
>>> d = f()
>>> d.x
2
>>> d == c
True

好像变量 a 变成了全局变量,这不是真的,但仍然调用方法 f 变量 a 没有像我预期的那样重新实例化。

这背后的原因是什么?

【问题讨论】:

  • 这是Python的设计决定,它只在处理“f”的函数定义时处理一次,而不是每次调用。

标签: python scope


【解决方案1】:

函数参数的默认值是在定义函数时计算的,而不是在调用函数时。

【讨论】:

    【解决方案2】:

    在定义函数时评估和存储默认值。

    >>> f.__defaults__
    (<__main__.foo object at 0x105c02860>,)
    

    表达式foo() 不存储为默认值,稍后调用;计算表达式的结果是。

    参数a 仍然是一个局部变量,但如果没有参数传递给调用,它引用一个由所有f 调用共享的对象。

    【讨论】:

      【解决方案3】:

      a=foo() 在模块加载后只会被评估一次。当您调用该函数时,它不会再次运行。函数的默认参数总是以这种方式运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-21
        • 2021-11-14
        • 1970-01-01
        • 2015-09-26
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        相关资源
        最近更新 更多