【问题标题】:how to use the b = [[1]*3]*3 in a proper way?如何正确使用 b = [[1]*3]*3 ?
【发布时间】:2011-03-29 01:28:20
【问题描述】:

全部,

代码:

#=A===================
>>> b = [[1]*3]*3
>>> b 
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> b[0][0] = 0                 
>>> b
[[0, 1, 1], [0, 1, 1], [0, 1, 1]]
>>> 
#=B===================
>>> b = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> b[0][0] = 0
>>> b
[[0, 1, 1], [1, 1, 1], [1, 1, 1]]
  1. 我可以使用类似于 "b = [[1]*3]*3" 的格式来获得与 "b = [[1 , 1, 1], [1, 1, 1], [1, 1, 1]]" 减少输入?

  2. as "b = [[1]*3]*3" 可能会返回一个基于“参考”的列表,它对日常工作有用吗?有样品吗?

谢谢! KC

【问题讨论】:

  • 我不想听起来很刺耳,但你的问题让我头疼 :D 你能改一下吗?
  • 这两个表达式做不同的事情。显然,您不能使用 b = [[1]*3]*3 作为您的示例所证明的。既然你已经给出了一个很好的证据证明它不会起作用,那么你的问题是什么?
  • @S.Lott,这个问题来自网络上的阅读帖子,当我阅读代码“b = [[1]*3]*3”时,我认为这个表达式足够清晰直接减少输入,但我确信它无法工作,是的,我理解它是一个“参考”列表,所以我认为是否可以对其进行改进并与“b = [[1, 1, 1 ], [1, 1, 1], [1, 1, 1]]" 以减少输入,并且由于 "b = [[1]*3]*3" 可能导致基于 "reference" 的列表,是对日常工作有用吗?
  • @user478514:你的例子证明b = [[1]*3]*3不能和b = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]一样工作。既然你已经创造了绝对的证据,证明两者永远不可能相同,你还想要什么?
  • @S.Lott,正如我所说,“b = [[1]*3]*3” 看起来比“b = [[1, 1, 1], [1 , 1, 1], [1, 1, 1]]",所以我需要的是一个表达式,下面的朋友给出了答案“b = [[1]*3 for _ in range(3)]”,此外,由于 "b = [[1]*3]*3" 也是一个语法有效的表达式,那么我想它可能会以某种方式有用......

标签: python variables evaluation


【解决方案1】:

您的代码的问题在于它引用了同一个列表,所以当您执行b[0][0] = 0 时,您实际上是在更新引用处的值(所有三个数组都指向其中)。

为了得到想要的结果,我会这样做(使用list comprehension):

>>> b = [[1]*3 for _ in range(3)]
>>> b
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> b[0][0] = 0
>>> b
[[0, 1, 1], [1, 1, 1], [1, 1, 1]]

它实际上重新创建了一个列表,因此它引用了不同的列表,而不是您的答案中的同一个列表。

b = [[1]*3 for _ in range(3)] 等价于:

b = []
for _ in range(3):
  b.append([1]*3)

【讨论】:

    【解决方案2】:

    您可以改为使用列表推导来构建您的列表:

    b = [[1]*3 for _ in range(3)]
    

    【讨论】:

      【解决方案3】:

      您的问题是 [[1, 1, 1]] * 3 创建了一个列表,其中包含对同一 [1, 1, 1] 列表的三个引用。为了做你想做的事,你必须使用 list() 或使用切片表示法创建 [1, 1, 1] 的副本:

      first_list = [1, 1, 1]
      second_list = [first_list[:], first_list[:], first_list[:]]
      

      second_list = [list(first_list), list(first_list), list(first_list)]
      

      要在一行中完成上述操作,您可以这样做:

      second_list = [[1] * 3 for i in range(3)]
      

      【讨论】:

        【解决方案4】:

        在 A 部分: 您有一个包含 3 个项目的列表,但所有项目都指向一个对象:

        [1]*3

        像这样:

        a = [1,1,1]
        b = [a,a,a]
        

        但是在 B 部分,您有一个包含不同项目的列表

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-11
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2016-11-27
          • 2020-03-13
          • 1970-01-01
          相关资源
          最近更新 更多