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

刷力扣时踩的坑

list1 = [] * (n) 
list2 = [[] for _ in range(n)]

`在 Python 中产生的结果不同

1. 

[] * (n)


   这会创建一个包含 `n` 个相同空列表的列表。这意味着它会复制空列表 `n` 次,以创建一个包含这些复制的新列表。这些复制的列表都是相同的对象,因此如果你修改一个列表,其他的也会随之改变,因为它们都引用相同的对象

   例如,如果你执行以下代码:
 

n = 3
my_list = [[]] * (n)
my_list[0].append(1)
print(my_list)


   输出将是 `[[1], [1], [1], [1]]`,因为它们引用了相同的空列表。

2.

[[] for _ in range(n)]


   这会创建一个包含 `n` 个不同空列表的列表。每个内部的空列表都是一个独立的对象,因此修改其中一个不会影响其他的列表

   例如,如果你执行以下代码:

   n = 3
   my_list = [[] for _ in range(n)]
   my_list[0].append(1)
   print(my_list)


   输出将是 `[[1], [], [], []]`,因为每个内部的空列表都是独立的对象。

总之,区别在于第一个方法创建的列表中的元素都是相同的对象,而第二个方法创建的列表中的元素都是独立的对象。

3.

[1] * n

这会创建一个包含 n 个相同的元素为 1 的列表。这意味着所有的元素都是相同的整数对象,修改其中一个不会影响其他的列表

例如,如果你执行以下代码:

n = 3
my_list = [1] * (n + 1)
address1 = id(my_list[0])
address2 = id(my_list[1])
print(f"The memory address of my_list[0] is: {address1}")
print(f"The memory address of my_list[1] is: {address2}")

# 对其中一个元素进行修改
my_list[0] = 2
address1 = id(my_list[0])
address2 = id(my_list[1])
address3 = id(my_list[2])
print(f"The memory address of my_list[0] is: {address1}")
print(f"The memory address of my_list[1] is: {address2}")
print(f"The memory address of my_list[2] is: {address3}")
print(my_list)
# 运行结果
The memory address of my_list[0] is: 140729221738768
The memory address of my_list[1] is: 140729221738768
The memory address of my_list[0] is: 140729221738800
The memory address of my_list[1] is: 140729221738768
The memory address of my_list[2] is: 140729221738768
[2, 1, 1, 1]

虽然所有的元素都是相同的整数对象,但你可以修改其中一个元素而不影响其他元素

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值