python - 可怕的初始值 - 可变类型共享相同的引用?

标签 python

<分区>

我刚刚拥有。我不敢相信这是真的,但经过测试,我发现它是:

class A(object):
    v = []

a = A()
b = A()

您认为以下代码会返回什么?

a.v is b.v

这个代码怎么样?

a.v.append(1)
a.v[0] == b.v[0]

果然,a.v 是 b.v,它们都共享相同的引用 相同的列表。来自,嗯,所有其他编程语言背景,这有什么意义?

在 Java 中,如果我要编写这样一个类:

class A {
    public Object[] v = new Object[]{};
}

...在我最疯狂的梦想中,我永远不会认为该类的两个实例会共享对数组的相同引用。

我的主要问题是,Python 类中的初始值是否与 Java、C# 等中的初始值等价?为什么该类的所有实例共享对同一列表的相同引用?

最佳答案

您定义了类属性而不是实例属性。 Python 正在做正确的事情。

代替

class A(object):
    v = []               # Class attribute, shared across all instances!

你需要

class A(object):
    def __init__(self):  # Instance attribute, created anew for each new object
        self.v = []

关于python - 可怕的初始值 - 可变类型共享相同的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16536254/

相关文章:

python - 使用枚举定义 Python 类

python - 为什么我们不需要将 self 包含在 super() 中?

python - 从文件导入对象而不运行该文件的导入

python - 如何在 django 管理界面中更改默认字体?

java - 使用 jython 运行带有来自 java 的参数的 python 函数

python - 如何设置SocketServer的最大连接数

python - 从多个字符串中提取序列

python - 汇总文本文件中的列

python - 用于查找文件路径的正则表达式

python - 类型错误 : __init__() missing 1 required positional argument: 'get_response'