美文网首页
python可变类型的陷阱

python可变类型的陷阱

作者: 谦面客 | 来源:发表于2018-12-07 11:10 被阅读0次

    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可变类型的陷阱

          本文链接:https://www.haomeiwen.com/subject/ldzzcqtx.html