Не с np.arange
, поскольку это дает вам полностью материализованный массив :
>>> r = np.arange(0., 1000000., 1)
>>> type(r)
<class 'numpy.ndarray'>
>>> r.__sizeof__()
8000048
Так что после его создания просто слишком поздно. Кроме того, он не имеет доступа к вашей переменной stepsize
, поэтому не мог заметить, что вы ее изменили.
Сравните с range
, который является легким объектом, который вычисляет значения на лету:
>>> r = range(0, 1000000, 1)
>>> type(r)
<class 'range'>
>>> r.__sizeof__()
24
(заметьте, я использую Python 3 ... вам действительно нужно присоединиться к нам. Не только потому, что в Python 2 эквивалент имеет уродливое имя xrange
.)
Теперь ... этот range
объект имеет атрибут step
:
>>> dir(r)
['__bool__', '__class__', ..., 'count', 'index', 'start', 'step', 'stop']
Но это не позволит нам изменить его:
>>> r.step = 2
Traceback (most recent call last):
File "<pyshell#46>", line 1, in <module>
r.step = 2
AttributeError: readonly attribute
Вы можете использовать свой собственный Класс диапазона, поддерживающий такое изменение состояния, хотя:
class Range:
def __init__(self, start, stop, step):
self.current = start
self.stop = stop
self.step = step
def __iter__(self):
while self.current < self.stop:
yield self.current
self.current += self.step
for i in (r := Range(0, 10, 1)):
print(i)
if i > 5:
print("change")
r.step = 0.5
Вывод:
0
1
2
3
4
5
6
change
6.5
change
7.0
change
7.5
change
8.0
change
8.5
change
9.0
change
9.5
change