tf.constant的常量性存疑:为何执行c += 1后值会改变?
为什么tf.constant用+=能"修改"值?
哈哈,这个问题其实是Python运算符语法糖和TensorFlow张量特性结合的小陷阱,我来给你掰扯清楚:
首先明确一点:tf.constant创建的确实是不可修改的常量张量,你并没有真的修改它本身,只是被Python的+=运算符给"骗"了。
具体原因拆解:
- 当你执行
c = tf.constant([2])时,c这个变量名指向了一个不可变的张量对象(值为[2]),这个对象的内部数据是不能被修改的。 - 而Python里的
+=运算符对于张量来说,等价于c = c + 1:c + 1会创建一个全新的张量(计算后值为[3]);- 然后把变量名
c重新绑定到这个新张量上; - 原来的那个[2]的常量张量其实还在内存里,只是
c不再引用它了而已。
验证一下就懂了:
你可以试试这段代码:
import tensorflow as tf c = tf.constant([2]) # 先保存原来的张量引用 original_c = c # 执行你说的+=操作 c += 1 print(c) # 输出:tf.Tensor([3], shape=(1,), dtype=int32) print(original_c) # 输出:tf.Tensor([2], shape=(1,), dtype=int32)
看到没?原来的常量张量根本没被改动,只是c换了个指向的对象。
那怎么才是真的尝试修改constant?
如果你真的想直接修改常量张量的内容,比如用tf.assign,就会直接报错,这才是constant不可修改的真正体现:
c = tf.constant([2]) tf.assign(c, [3]) # 会抛出类似"Cannot assign variable to a constant tensor"的错误
总结一下:你看到的"修改"只是变量名的重新绑定,不是常量张量本身被修改了~
内容的提问来源于stack exchange,提问作者Long Luu
相关产品推荐
相关产品推荐

