Python: Почему этот массив получает количество индексов gridwidth? - PullRequest
2 голосов
/ 04 апреля 2020
for i in range(0, gridwidth):
        row.append(random.randint(0, 1))

Поскольку индексация массива начинается с 0, я предположил, что массив row будет иметь индексы gridwidth + 1, поскольку он будет считать каждое целое число вплоть до gridwidth включительно, но также и 0. Однако после проверки массив, он содержит только gridwidth количество индексов. Хотя это не мешает моему коду, мне любопытно, почему это происходит.

Ответы [ 4 ]

1 голос
/ 04 апреля 2020

Хотя это не мешает моему коду, мне любопытно узнать, почему это происходит.

Ну, вы сделали следующее предположение:

, поскольку он будет считать каждое целое число вплоть до ширины сетки, но также и 0.

Вы пробовали проверить это предположение?

for i in range(0, gridwidth):
    print(i)

Обратите внимание что значение gridwidth равно , а не напечатано.

Или вы могли бы попытаться прочитать документацию:

>>> help(range)
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |
 |  Return an object that produces a sequence of integers from start (inclusive) |  to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
 |  start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
 |  These are exactly the valid indices for a list of 4 elements.
 |  When step is given, it specifies the increment (or decrement).

Причина, по которой это происходит, заключается в том, что Вот как range определено для работы.

Мотивация для определения range такова, потому что это то, к чему привыкли программисты - потому что в старых языках вы индексируете массивы в своих циклах (вместо получение предметов напрямую) легче избежать логических ошибок таким образом.

0 голосов
/ 04 апреля 2020

Если вам действительно любопытно, попробуйте следующее:

print(len(range(0, gridwidth)))

Затем посмотрите range () документацию,

содержимое диапазон r определяется по формуле r [i] = start + step * i, где i> = 0 и r [i]

range(0, gridwidth) (диапазон является классом неизменных итерируемые объекты) вернет последовательность с номерами от 0 до (ширина сетки - 1).

for i in range(0, 5):
    print(i)

Выходы:

0
1
2
3
4
0 голосов
/ 04 апреля 2020

Это потому, что функция range закрыта с левой стороны и открыта с правой стороны. Это означает, что оно будет включать 0, но не gridwidth. Математическая запись - [0, ширина сетки). Таким образом, ваша итерация состоит из 0 to gridwidth-1 making array contain gridwidth` элементов.

0 голосов
/ 04 апреля 2020

ваш for l oop будет повторяться gridwidth раза, поэтому к вашему row будут добавлены gridwidth элементы, также вы можете обратить внимание на встроенный класс range , который давая вам количество итераций для вашего for l oop, диапазон даст вам числа от 0 до gridwidth - 1

, range(0, gridwidth) то же самое с range(gridwidth) Начальная точка для range по умолчанию 0

, если вы хотите добавить gridwidth + 1 элементов, добавленных к вашему row, вы можете использовать:

for i in range(gridwidth + 1):
        row.append(random.randint(0, 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...