作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的很难理解这种行为是如何出现的。我已将其简化为尽可能小的示例,但仍然会产生不良效果。
代码:
class Demo:
def __init__(self, x=[]):
self._x = x
print x
def add_x(self, data):
self._x.append(data)
for x in range(0, 5):
obj = Demo()
obj.add_x([1, 2])
输出:
[]
[[1, 2]]
[[1, 2], [1, 2]]
[[1, 2], [1, 2], [1, 2]]
[[1, 2], [1, 2], [1, 2], [1, 2]]
我错过了什么?
最佳答案
def __init__(self, x=[]):
self._x = x
在这种情况下,每当您不带参数初始化类的实例时,self._x 将引用同一对象,而不是为每个实例创建一个新的空列表。实际上,self._x.append
正在附加到同一列表。
推荐的方法是
def __init__(self, x=None):
if x is None:
# create a new list
x = []
self._x = x
这适用于所有可变对象(例如 dict
和 set
...)。
关于Python __init__ 从无处寻找变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30236797/
假设我在 net.aserve 和 bordeaux-threads 之上构建了一个应用程序。我的包声明可能如下所示: (defpackage :my-package (:use :cl :net
我是一名优秀的程序员,十分优秀!