【问题标题】:Python variabale assignmentPython变量赋值
【发布时间】:2018-11-05 16:44:21
【问题描述】:

问候程序员,

我有一个特别的问题要问——更准确地说是关于分配变量时 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 时,python 会以某种方式自动忘记旧变量并将 train_images 构造为新变量?

请原谅我缺乏 python 的行为知识 - 如果有一个明显的答案,只需发布​​一些解释链接或描述此案例的一些文档。

非常感谢您,祝您有愉快的一天!

编辑:

“不可写”是指该对象是只读的(当我们打印数组的描述 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 运行良好。

【问题讨论】:

  • 您确定train_images /= 250.0 不起作用吗?对于不可变值,它应该与train_images = train_images / 250.0 一样对待,否则x = 1; x /= 250.0 将不起作用。 train_images是什么类型?
  • 我不知道你所说的“不可写”是什么意思。 train_images 的类型是什么?当您尝试/= 操作时,您究竟会遇到什么错误? Python 不会以您声称的方式区分这些操作。你可以有不可变的类型(例如元组),但这仍然有效。
  • train_images /= 250.0解释器终止程序并打印错误:Traceback (most recent call last): File "code_01_fashion.py", line 31, in &lt;module&gt; train_images /= 250.0 ValueError: output array is read-only

标签: python variables python-3.6 variable-assignment


【解决方案1】:

重要的是要知道这不是普通蟒蛇。 Keras.datasets.fashion_mnist.load_data() 返回一个 NumPy 数组。 (NumPy 是使用 Python 进行科学计算的基础包。About NumPy

可以为 写入 禁用 numpy 数组。 Details

当您使用就地运算符 (x /=250.0) 时,您明确要求修改您的对象,但在这种情况下,您是不允许的。

如果你想检查你的 NumPy 数组是否可写,你可以运行:

>> train_images.flags

并检查 WRITEABLE 中的布尔值

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

因此,在这种情况下,您正在创建一个新对象并重新分配变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2013-09-13
    • 2016-01-24
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多