python - np.array 作为 Python 中属性的默认值被多个实例引用?

标签 python default-arguments

我有一个带有一些属性字段的类,它是一个 numpy 数组。该类能够生成同一类的新实例。现在我的问题是所有实例 这样创建的似乎指向同一个字段属性。因此,当给定代码的预期输出是:

[0, 0]

[1, 0]

[0, 2]

它实际上给出了:

[1, 2]

[1, 2]

[1, 2]

当我随后更改a.field中的条目时,所有实例的字段属性中的条目都会更改

有人知道如何解决这个问题或者我在这里理解错误吗?

import numpy as np

class A:
    def __init__(self, field=np.zeros(2)):
        self.field=field

    def setField(self, c, index):
        if index<len(self.field):
            self.field[index]=c


    def multiply(self):

        new_A=np.empty(2, dtype=object)

        for n in range(0, 2, 1):
            new_A[n]=A()
            new_A[n].setField(n+1, n)

        return new_A



a=A()

subs=a.multiply()

print a.field
print subs[0].field
print subs[1].field

最佳答案

您不应该将数组作为默认参数,而应该像这样定义它:

class A:
    def __init__(self, field=None):
        if field is None:
            field = np.zeros(2)

        self.field=field

    def setField(self, c, index):
        if index<len(self.field):
            self.field[index]=c


    def multiply(self):

        new_A=np.empty(2, dtype=object)

        for n in range(0, 2, 1):
            new_A[n]=A()
            new_A[n].setField(n+1, n)

        return new_A

查看“Least Astonishment” in Python: The Mutable Default Argument有关为什么不应使用列表或数组作为默认参数的详细说明。

关于python - np.array 作为 Python 中属性的默认值被多个实例引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25849304/

相关文章:

php - 根据先前的参数获取默认参数的值

python - 从 Python 文件中读取包含整数的行?

python - Pandas 数据框

c++ - 模板特化中的默认实参参数

c++ - 为什么编译器不能从默认参数中推断出模板类型?

python-3.x - 在Python中,如何输入提示具有空默认值的列表?

javascript - 如何使用不变的 URL 抓取多个页面 - Python 3

python - 在 django Rest 框架中返回 Respose 对象时出现 NoReverseMatch 错误

python - 如何处理动态语言中错误的参数类型?

python - 如何将 functools.partial 与 os.path.join 一起使用?