zoukankan      html  css  js  c++  java
  • 小心python的list乘法

    python是个很方便的语言,我经常使用python的*操作符去构建list中的重复元素。例如:

    1. >>> l = [1] * 4
    2. >>> print(l)
    3. >>> [1, 1, 1, 1]

    这样做确实很方便,但也很危险,请先看下面的代码:

    1. >>> l = [{'a': 1}] * 4
    2. >>> print(l)
    3. >>> [{'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}]
    4.  
    5. >>> l[0]['a'] = 2
    6. >>> print(l)
    7. >>> [{'a': 2}, {'a': 2}, {'a': 2}, {'a': 2}]

    我改了list中的一个dict的值为2, 全部的dict都为2了!!!

    一句话解释就是,*操作符在实现上是复制了值的引用,而不是创建了新的对象。所以上述的list里面,是4个指向同一个dict对象的引用。

    *操作符对于不可变对象很安全,但对于可变对象,可能就不是你期望的结果了。因为不可变对象是复制值,而可变对象是复制引用。

    使用以下代码避免问题:

    1. >>> l = [{'a': 1} for _ in range(4)]
    2. >>> print(l)
    3. >>> [{'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}]
    4.  
    5. >>> l[0]['a'] = 2
    6. >>> print(l)
    7. >>> [{'a': 2}, {'a': 1}, {'a': 1}, {'a': 1}]


  • 相关阅读:
    QT资料大全
    网络协议及tcp协议详解
    QT和Java的跨平台
    QString转char *
    QT删除整个文件夹
    QT获取linux下的当前用户名
    std::map自定义类型key
    QT程序自启动
    linux下通过命令连接wifi
    Rsync实现文件的同步
  • 原文地址:https://www.cnblogs.com/liangzaikaituozhe/p/7868052.html
Copyright © 2011-2022 走看看