【问题标题】:Behavior of colon operator in x = myList[:] vs myList[:] = x [duplicate]x = myList[:] vs myList[:] = x [重复]中冒号运算符的行为
【发布时间】:2012-08-18 04:54:31
【问题描述】:

可能重复:
What is the difference between slice assignment that slices the whole list and direct assignment?

我没有钱上学,所以我一边在高速公路上的收费站轮班工作,一边自学一些 Python(长时间没有顾客)。 (顺便说一句:Coursera 应该翻译成所有语言...)

我在这里读到如果我有一个列表l:

l = ['a', '', 'b']

我想像这样过滤掉空字符串:

l = [c for c in l if c]

或者像这样:

l = filter(lambda x: x, l)

建议改为这样做:

l[:] = ... # either method 1 or method 2 above

不要“丢失”对第一个 l 的引用,尤其是在其他变量指向它的情况下。

我的问题:

  • 为什么在这种情况下l[:] 表示“l 的内容”,允许专门重新分配给“相同”l,而在其他地方我认为它是“相同大小的切片” ",方便为我创建一个 l 的副本

  • 我是否误解如何完全使用l[:] 进行相同列表重新分配?

我想如果我有一个l 并且我要求一个l[:],那么后者是原始l 的实际副本?

参考:《学习Python》-> 有很多种 复制列表的方法,包括使用内置列表函数和标准库 复制模块。也许最常见的方法是从头到尾切片

谢谢!

【问题讨论】:

  • 不完全。据我所知,这基本上是在问 l[:] 和 l[:] = ... 之间有什么区别。
  • @MartijnPieters 是的,我认为这可能与该问题相去甚远,足以被视为一个有用的独立问题
  • @MartijnPieters 我真的不认为这个问题是完全重复的。也许可以用措辞来强调 x = l[:] 和 l[:] = x 之间的区别,但这绝对是一个不同的问题。您可以通过查看另一个问题的答案来测试这一点,并注意到他们都不能充分回答这个问题。

标签: python list-comprehension slice


【解决方案1】:

在 Python 中,获取列表的一部分和设置列表的一部分是有区别的。事实上,它们实际上是独立的操作(分别为__getitem____setitem__)。所以,对于 get 的情况,对于 set 来说可能不正确。

在前一种情况下,l[:] 表示获取列表的副本(它生成一个全新的列表,其内容与旧列表的所有内容相同)。在后一种情况下,l[:] = ... 表示将列表的内容设置为其他内容。

【讨论】:

  • "确实它们实际上是独立的操作(__getitem____setitem__ ...)非常好(+1)
【解决方案2】:

因为 LHS 切片操作符基本上是说 遍历这个列表并为每个索引分配一些东西,而 RHS 操作符说 遍历这个列表,并使用值创建一个新对象。

让我们看看它的实际效果:

LHS

l[:] = [c for c in l if c!=0]  #ignore how stupid this list comprehension is

基本上分为:

l[0] = l[0] if l[0] != 0
l[1] = l[1] if l[1] != 0
...
l[n] = l[n] if l[n] != 0

因此,因为您是在枚举它并分配值,所以您并没有创建任何新对象——只是为 l 的索引赋予新值。

但是,另一方面,做

l = anything

更改变量l 持有的引用。之后,它指向内存中完全不同的对象。

右轴

现在,

c = l[:]

将为您提供l 的副本,而不是对l 的引用。这必须是真的,否则,

c = l[1:5]

如果要尝试使用与l 相同的对象引用,则必须更改l 的值。

【讨论】:

  • +1 "这必须是真的,否则......" :-)
【解决方案3】:

在赋值左侧使用切片运算符时,您是在告诉 python 将右侧的序列存储在列表的选定元素中。

换句话说,您没有替换l,而是分配给元素 l

【讨论】:

  • +1 不知道左侧的切片运算符
猜你喜欢
  • 2015-08-16
  • 2023-02-24
  • 2011-01-08
  • 2011-08-28
  • 2019-05-03
  • 1970-01-01
  • 2011-12-11
  • 2020-05-17
  • 2014-07-08
相关资源
最近更新 更多