python可变类型的陷阱

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变量相同

你可能感兴趣的:(python可变类型的陷阱)