gpt4 book ai didi

Python 可选参数

转载 作者:IT老高 更新时间:2023-10-28 22:23:55 31 4
gpt4 key购买 nike

各位,我最近刚开始使用python,对可选参数感到困惑,说我有这样的程序:

class B:
pass

class A:
def __init__(self, builds = B()):
self.builds = builds

如果我创建 A 两次

b = A()
c = A()

并打印他们的构建

print b.builds
print c.builds

我发现他们使用的是完全相同的对象,

<__main__.B instance at 0x68ee0>
<__main__.B instance at 0x68ee0>

但这不是我想要的,因为如果 b 改变了构建的一些内部状态,那么 c 对象中的那个也会改变。

是否可以通过使用此可选参数语法每次重新创建此可选参数?

最佳答案

您需要了解默认值的工作原理才能有效地使用它们。

函数是对象。因此,它们具有属性。所以,如果我创建这个函数:

>>> def f(x, y=[]):
y.append(x)
return y

我创建了一个对象。以下是它的属性:

>>> dir(f)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__',
'__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__',
'__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals',
'func_name']

其中之一是 func_defaults。听起来很有希望,里面有什么?

>>> f.func_defaults
([],)

这是一个包含函数默认值的元组。如果默认值是一个对象,则元组包含该对象的一个​​实例。

如果您认为 f 将一个项目添加到列表中,这会导致一些相当违反直觉的行为,如果没有提供列表,则返回一个仅包含该项目的列表:

>>> f(1)
[1]
>>> f(2)
[1, 2]

但是,如果您知道默认值是存储在函数属性之一中的对象实例,那么违反直觉的情况就会少得多:

>>> x = f(3)
>>> y = f(4)
>>> x == y
True
>>> x
[1, 2, 3, 4]
>>> x.append(5)
>>> f(6)
[1, 2, 3, 4, 5, 6]

知道了这一点,很明显,如果您希望函数参数的默认值是一个新列表(或任何新对象),您不能简单地将对象的实例存储在 func_defaults。每次调用函数时都必须创建一个新函数:

>>>def g(x, y=None):
if y==None:
y = []
y.append(x)
return y

关于Python 可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1585247/

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