Python вариабельное назначение - PullRequest
0 голосов
/ 05 ноября 2018

Привет программистам,

У меня есть один конкретный вопрос - точнее о поведении python при назначении переменной. Давайте предположим, что этот код (взят из руководства Tensorflow):

(train_images, train_labels), (test_images, test_labels) = keras.datasets.fashion_mnist.load_data()

Я понимаю, что не могу сделать следующее:

train_images /= 250.0

-объект train_images недоступен для записи, поэтому я не могу его изменить.

Но я определенно могу сделать следующее, чего я не понимаю:

train_images = train_images / 250.0

Означает ли это, что когда я "переназначаю" переменную train_images, питон каким-то образом автоматически забывает о старой и создает train_images как новую переменную?

Прошу прощения за отсутствие знаний о поведении python - если есть очевидный ответ, просто отправьте ссылку на объяснение или документацию, где описан этот случай.

Большое спасибо и хорошего дня!

EDIT:

Под «без записи» я подразумевал, что объект доступен только для чтения (когда мы печатаем описание массива print( train_images.flags ), мы получаем информацию из одной из строк, WRITEABLE : False

А более конкретно, когда используется train_images /= 250.0, программа завершается и выдается следующая ошибка:

Traceback (most recent call last): File "code_01_fashion.py", line 31, in <module> train_images /= 250.0 ValueError: output array is read-only

С другой стороны train_images = train_images / 250.0 работает просто отлично.

1 Ответ

0 голосов
/ 05 ноября 2018

важно знать, что это не ванильный питон. Keras.datasets.fashion_mnist.load_data () возвращает массив NumPy. (NumPy - это фундаментальный пакет для научных вычислений на Python. О NumPy )

Возможно отключить массив numpy для записи . Подробнее

Когда вы используете операторы на месте (x /=250.0), вы явно просите изменить свой объект, но в этом случае вам это не разрешено.

Если вы хотите проверить, доступен ли для записи массив NumPy, вы можете выполнить:

>> train_images.flags

и проверьте логическое значение в ЗАПИСИ

C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : False
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False

Когда вы делаете что-то вроде:

train_images = train_images / 250.0

похож на:

temp = train_images / 250.0
train_images = temp

Итак, в этом случае вы создаете новый объект и переназначаете переменную.

...