python中[[]] * (n)和[[] for _ in range(n)]的区别

1、现象

刷leetcode207的时候碰到一个坑,用[[]] * (n)初始化二维数组,逻辑是正确的,但是结果始终不对。

2、原因

最后定位是初始化语句使用错误导致的,我使用的是[[]] * (n),应该使用[[] for _ in range(n)]

3、解释

[[]] * (n)和[[] for _ in range(n)]打印结果完全一样,但是原理却不一样

[[]] * (n)表示复制子列表( 此处为[] ) n次,这些子列表指向或引用相同的对象,也就是内存地址一样,因此修改其中一个子列表元素,会同时影响其他子列表的值,如下面代码中的L1

[[] for _ in range(n)] 表示列表的子列表元素是每次for循环创建的新对象,这些子列表指向或引用不同的对象,内存地址当然也不一样,因此修改其中一个子列表元素,不会影响其他子列表的值,如下面代码中的L2

n = 2
L1 = [[]] * n
L2 = [[] for _ in range(n)]
print(f'L1:{L1}, L2:{L2}')
print(L2 == L2)   #值相等
print(id(L1[0]),id(L1[1])) # L1列表内的元素,地址相同
print(id(L2[0]),id(L2[1])) # L2列表内的元素,地址不同
L1[0].append(1)
L2[0].append(1)
print(f'L1:{L1}, L2:{L2}')

打印结果:

4、注意

L1 中的元素是列表,是可变对象,使用*n复制,不同元素才会指向同一个对象,但是如果L1中元素是不可变对象,比如int、string、float、tuple,使用*n复制的时候,不同元素也会指向同一个元素,但是修改时,由于是不可变对象,修改时会重新开辟一块内存,变量指向新地址,这样修改其中一个元素,不会影响其他元素

i = 2
L1 = [2] * i   # 列表元素为不可变对象 int
print(L1)
print(id(L1[0]),id(L1[1]))
L1[0] = 4
print(id(L1[0]),id(L1[1]))
print(L1)

打印结果为

5、其他

可变数据类型:列表list[ ]、字典dict{ }

不可变数据类型:整型int、字符串str' '、元组tuple()浮点数float

相关推荐

  1. Python,type() isinstance() 区别

    2024-02-07 11:20:02       20 阅读
  2. PythonPython装饰器魔法方法区别

    2024-02-07 11:20:02       20 阅读
  3. pythonlxml.etree ElementTree 区别

    2024-02-07 11:20:02       30 阅读
  4. Python‘字符串’‘字符串流’区别

    2024-02-07 11:20:02       32 阅读
  5. Python正则表达式subreplace区别

    2024-02-07 11:20:02       44 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-07 11:20:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-07 11:20:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-07 11:20:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-07 11:20:02       18 阅读

热门阅读

  1. c#内置委托

    2024-02-07 11:20:02       30 阅读
  2. 一些学习的总结帖子

    2024-02-07 11:20:02       29 阅读
  3. Linux在云计算领域的重要作用

    2024-02-07 11:20:02       37 阅读
  4. 关于发布部署的简述实践和若干思考

    2024-02-07 11:20:02       37 阅读
  5. 为什么要用建造者模式

    2024-02-07 11:20:02       33 阅读
  6. curl调用带csv文件和json参数的http接口

    2024-02-07 11:20:02       36 阅读
  7. 十分钟学会WebSocket

    2024-02-07 11:20:02       30 阅读
  8. 【嵌入式开发】29

    2024-02-07 11:20:02       28 阅读
  9. 每天一个数据分析题(一百五十三)

    2024-02-07 11:20:02       38 阅读
  10. C语言学习(8)—— 输入输出

    2024-02-07 11:20:02       29 阅读