python变量分为两种类型:
不可变类型(数字、字符串、元组)
可变类型(列表、字典)
本文讲述两个可变类型的坑
1、两种方式创建嵌套列表
2、可变类型作为默认值的危害
例1:两种方式创建嵌套列表
(1)循环添加
(2) 列表相乘
上面第二种方式看起来写的很简洁,但得到的结果不一样
第(1)种方式 等于每次新创建了一个列表追加到result,等价于
result = []
for i in range(2):
temp = ['a'] * 3
result.append(temp)
第(2)种方法相当于在result里引用多次同一个列表,等价于
temp = ['a'] * 3
result = []
for i in range(2):
result.append(temp)
所以改变[0][0]下标为'b',[0][0]和[0][1]同时改变了
上面图id方法也验证了两个列表的指向的内存地址,第一种方法不同,第二种方法相同
例2:可变类型作为默认值的危害
现在有一个Person类,有一个买书和卖书的方法
class Person:
def __init__(self, name, books=[]):
self.name = name
self.books = books
def buy_book(self, book_name):
self.books.append(book_name)
def sell_book(self, book_name):
self.books.remove(book_name)
由图可见,由于默认值是可变类型,创建的两个实例books变量引用的是同一个,导致这种问题出现.
整个过程是这样的:类在初始化的时候已经创建了一个列表, 创建小明时把这个列表的引用传给ming.books,创建小红时,还是把这个列表的引用传给hong.books,所以两个对象的books变量相同