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

Naf*_*Kay 1 python

我刚刚拥有.我无法相信这是真的,但经过测试,我发现它是:

class A(object):
    v = []

a = A()
b = A()
Run Code Online (Sandbox Code Playgroud)

您如何看待以下代码将返回?

a.v is b.v
Run Code Online (Sandbox Code Playgroud)

这段代码怎么样?

a.v.append(1)
a.v[0] == b.v[0]
Run Code Online (Sandbox Code Playgroud)

果然a.v is b.v,他们都共享相同的参考,以相同的列表.来自一个,以及其他所有编程语言背景,这有什么意义?

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

class A {
    public Object[] v = new Object[]{};
}
Run Code Online (Sandbox Code Playgroud)

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

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

Tim*_*ker 13

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

代替

class A(object):
    v = []               # Class attribute, shared across all instances!
Run Code Online (Sandbox Code Playgroud)

你需要

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

  • @TKKocheran:也许你想看一下[基础Python教程](http://docs.python.org/2/tutorial/classes.html)? (2认同)
  • @TKKocheran,很难说你是在开玩笑还是在讽刺......规则手册已经结束了[这里](http://docs.python.org/2/reference/) (2认同)