当我遇到意想不到的问题时,我正在用Python做一些工作.我有一个类,两个变量x和y.x和y意味着是类的独立副本,每个副本都有自己的数据.所以我设置x等于类并给它一些值,然后用y做同样的事.一旦我尝试使用该数据,我意识到我覆盖了x的值.似乎我没有创建两个单独的类副本来使用,而是两个引用同一个类.所以这是代码中的一般示例:
x = someClass()
x.set(2, 0)
y = someClass()
y.set(3, 0)
print(x)
Run Code Online (Sandbox Code Playgroud)
最终结果是打印3而不是2.我想创建一个单独的"版本"类来保存每个变量的不同数据.不确定如何.使用Python 3.3.这是该类的代码:
class someClass:
def __init__(self, list = [0,0,0,0,0,0,0,0,0,0]):
self.list = list
def __repr__(self):
return str(self.list)
def set(self, loc, val):
if ((loc >= 0) & (loc <= 9)):
self.list[loc] = val
Run Code Online (Sandbox Code Playgroud)
你陷入了Python的常见新手陷阱.像您一样使用列表作为默认变量def __init__(self, list = [0,0,0,0,0,0,0,0,0,0])意味着该类的所有实例与该参数的值共享相同的列表实例.另见"最小惊讶"和可变默认参数
顺便说一句,如果你想使用一个容器对象(如列表作为默认参数),那么常用的习惯就是使用None并检查它.例如:
def __init__(self, values=None):
if values is None:
values = [0] * 10
Run Code Online (Sandbox Code Playgroud)
管他呢.不像默认参数那样清楚地自我记录,但它有效.
作为旁注,不要使用list变量名称,因为它会影响(有点常用的)list内置.