在[ ]
函数之后,不确定range()
内的参数是什么。
Exp:print ( range(5)[::-2])
输出:[4, 2, 0]
但如果[x:y:z]
代表[start:stop:step]
,那么当我添加print(range(5)[4:-2:-2])
时,输出列表为[4]
而非[4, 2, 0]
,不确定其工作原理
答案 0 :(得分:8)
在Python 3中,range()
创建了一个特殊的range
对象。在Python 2中,它创建了一个list
。
List element: 0 1 2 3 4
Index: 0 1 2 3 4
Backwards index: -5 -4 -3 -2 -1
因此,从索引4
转到索引-2
实际上是从列表元素4
转到列表元素3
。由于您正在跳过所有其他元素,因此您无法访问3
,只留下[4]
。
答案 1 :(得分:7)
你是对的,是[start:stop:step]
。请注意,负启动和停止定义为从序列结束开始。因此,对于以值2, 3, 4
结尾的范围,stop -2
引用3
(-1是最后一个,-2是倒数第二个,等等。) / p>
所以在你的情况下,范围的长度为5,从0开始到4结束。从索引4开始,到索引-2结束,即5-2 = 3
。所以到目前为止,索引指的是[3, 4]
。现在,从4开始,你有一个负2的步骤。所以你跳过3,结果只是[4]
。
如果你想要[4, 2, 0]
,那么你应该忽略停止:
>>> range(5)[4::-2]
[4, 2, 0]
你甚至可以忽略开始:
>>> range(5)[::-2]
[4, 2, 0]
但
range(5)[4:-2]
结果为[]
。那么range(5)[4:-2:-2]
结果如何[4]
?
一次评估切片,而不是一个接一个的参数:
评估否定结果后,range(5)[4:-2]
相当于range(5)[4:3]
。由于未指定步骤,因此将使用正数1的默认步骤。这意味着切片必须以正步骤从索引4转到索引3。这是不可能的,所以返回一个空列表。
当我们采取否定步骤时,它看起来像这样:range(5)[4:3:-2]
。现在,由于我们有一个消极的步骤,方向是相反的。所以我们可以从索引4开始,然后转到较低的索引3。
刚刚定义,对于一个积极的步骤,stop >= start
必须为真,而对于一个反向步骤,stop <= start
。
答案 2 :(得分:2)
根据[start:stop:step]
定义的三个参数的切片。巧合的是,这也是范围对象用三个参数定义的方式。我们很快就会看到它是如何发挥作用的。
你在做什么是这样的:
>>> range(5)
[0, 1, 2, 3, 4]
>>> range(5)[4:-2:-2]
[4]
Python中的负索引从序列的长度开始。因此,列表的长度为5,然后用-2向下两步,因此您将索引3作为停止值。换句话说,索引3是迭代器的标记值,此时切片操作将停止收集元素。你将逐步降低2个索引,但索引3是哨兵,因此切片在抓取索引4处的元素并达到停止索引后停止收集元素。
你可能真正想做的是:
>>> range(4, -2, -2)
[4, 2, 0]
答案 3 :(得分:-1)
你可以将[x:y:z]代表[start:stop:jumps]在5的范围内,它将迭代超过0-4(包括两者),因为你的z是负数,它将从4迭代到0 2跳4 --- 3 --- 2(---代表跳跃)所以输出是 4 ---(3)--- 2 ---(1)--- 0。 ------&GT; -------&GT;
快乐编码