列表创建和引用
类变量初始化
错误示范(除非你想要静态变量)
```
class Car(object):
color = "red"
wheels = [Wheel(), Wheel(), Wheel(), Wheel()]
```
正确的做法:
```
class Car(object):
def __init__(self):
self.color = "red"
self.wheels = [Wheel(), Wheel(), Wheel(), Wheel()]
```
**函数默认参数**
```
def foo(li=[]):
li.append(1)
print(li)
foo([2])
# Out: [2, 1]
foo([3])
# Out: [3, 1]
```
该代码的行为与预期的一样,但如果我们不传递参数呢?
```
foo()
# Out: [1] As expected...
foo()
# Out: [1, 1] Not as expected...
```
这是因为函数参数类型是定义是确认的而不是运行时,所以在两次函数调用时,li指向的是同一个list对象,如果要解决这个问题,可以这样:
```
def foo(li=None):
if not li:
li = []
li.append(1)
print(li)
foo()
# Out: [1]
foo()
# Out: [1]
```
这虽然解决了上述的问题,但,其他的一些对象,比如零长度的字符串,输出的结果就不是我们想要的。
```
x = []
foo(li=x)
# Out: [1]
foo(li="")
# Out: [1]
foo(li=0)
# Out: [1]
```
最常用的办法是检查参数是不是None
```
def foo(li=None):
if li is None:
li = []
li.append(1)
print(li)
foo()
# Out: [1]
```
**在遍历时修改**
列表推导和循环中的变量泄漏
or操作符