5

如果s是 Python 中的一个slice对象,使用s = slice(start, stop, step)or (在适当的上下文中)start:stop:step构造,用于构造的值s可从slice对象本身获得,如s.start,s.stops.step

Python 3.4 [ Issue9896 ]中的对象上提供了类似start的 ,stopstep成员。例如,。rangerange(1, 4, 2).start == 1

但是,Python 2.7xrange对象没有start,stopstep成员。xrange有没有其他方法可以从对象本身获取用于构造的值?

4

2 回答 2

4

可以恢复原始参数startstep参数,但并不总是原始stop参数。

获取值的一种方法是查看对象的__reduce__(or __reduce_ex__) 方法xrange(通常用于酸洗):

>>> x = xrange(10)
>>> x.__reduce__()[1]
(0, 10, 1)
>>> y = xrange(2, 100, 13)
>>> y.__reduce__()[1]
(2, 106, 13)

然后start, stop, step = y.__reduce__()[1]将三个变量名称分配给适当的整数。startstep值始终是用于构造xrange对象的原始值。

stop可能高于最初用于收缩对象的参数。对于任何xrange对象x,它都等于x[-1] + step

xrange通常,一旦创建了对象,就不可能恢复原始停止参数。如果您研究 的来源xrange,您会发现该对象不保留对特定停止值的引用,仅保留对迭代器的起始值、步长值和总长度的引用。当str__reduce__被调用时,对象将使用内部函数计算最新的可能停止值get_stop_for_range

这与 Python 3 的range对象相反,后者确实记住了原始停止值

于 2015-04-21T09:35:30.793 回答
3

它不漂亮,但你可以str解析xrange

>>> rr = xrange(1, 4, 2)
>>> str(rr)
'xrange(1, 5, 2)'
>>> start = str(rr).split('(')[1].split(',')[0]
>>> start
1

ETC

请注意,max如果在范围内指定了步骤,则无法以这种方式可靠地找到。例如,在上面的例子中,(1, 4, 2)变成(1, 5, 2)str表示中。

于 2015-04-21T09:24:32.867 回答