python:类对象列表的问题:所有项目都相同

标签 python list class

<分区>

Possible Duplicate:
“Least Astonishment” in Python: The Mutable Default Argument

我正在尝试从类“fooclass”创建一个具有不同属性的对象列表,但总是以包含相同值的列表的所有元素结束。

这是我运行的代码:

#!/usr/bin/env python

class fooclass():
  def __init__(self,vertices = [[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]):
    self.vertices = vertices

l=[]
print(l)
a=fooclass(); a.vertices[0]=[7,9,9]; l.append(a)
print 'a=', a.vertices
a=fooclass(); a.vertices[0]=[789,9,9]; l.append(a)
print 'a=', a.vertices
print(l[0].vertices)
print(l[1].vertices)
print(l)

l=[]
print(l)
a=fooclass(); a.vertices[0]=[7,9,9]; l.append(a)
print 'a=', a.vertices
b=fooclass(); b.vertices[0]=[789,9,9]; l.append(b)
print 'b=', b.vertices
print(l[0].vertices)
print(l[1].vertices)
print(l[0])
print(l[1])

我得到的输出:

$  python ./class_test2.py
[]
a= [[7, 9, 9], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
a= [[789, 9, 9], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[789, 9, 9], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[789, 9, 9], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[<__main__.fooclass instance at 0x7f945eafecf8>, <__main__.fooclass instance at 0x7f945eafed88>]
[]
a= [[7, 9, 9], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
b= [[789, 9, 9], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[789, 9, 9], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[789, 9, 9], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
<__main__.fooclass instance at 0x7f945eafecf8>
<__main__.fooclass instance at 0x7f945eafed88>

为什么 l[0].vertices 和 l[1].vertices 尽管输入了不同的值却完全一样?

系统信息:

Ubuntu 10.04.4 LTS
$  python --version
Python 2.6.5
$  uname -a
Linux *** 2.6.32-39-generic #86-Ubuntu SMP Mon Feb 13 21:50:08 UTC 2012 x86_64 GNU/Linux

注意:尝试使用 Python 3.1.2(只是更改打印语句),同样的问题。 :(

最佳答案

顶点的默认值can be modified in Python .您可以像这样重写 __init__ 来避免它:

def __init__(self, vertices=None):
    if vertices is None:
        vertices = [[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
    self.vertices = vertices

关于python:类对象列表的问题:所有项目都相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9791610/

相关文章:

java - Python @property 在处理类声明中的等效项?

python pyodbc SQL Server Native Client 11.0 无法返回几何列

python - MagicMock 和包装

python - 如何将二维 numpy 数组与结构化数组合并

c# - 将值添加到缺少数据的列表

javascript - 类函数不是函数

python - 在 Pygame 中创建多个交互式多边形按钮

python - 在给定股票列表的循环中创建不同的数据框

python - 将列表的列表与其自身进行比较

java - 登录顺序逻辑