当预期元组类型参数时,我们是否总能使用列表类型作为函数参数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当预期元组类型参数时,我们是否总能使用列表类型作为函数参数?相关的知识,希望对你有一定的参考价值。
我一直在研究用Python编写的Tensorflow API。我有两个问题。
1.当预期元组时,我们是否总能使用列表类型作为函数参数?
如果我们查看有关tf.placeholder
及其示例(https://www.tensorflow.org/api_docs/python/tf/placeholder)的官方API定义,我们会看到此函数的第二个参数是“形状”。在示例代码中,我们可以看到元组用于提供形状信息作为参数,如下所示。
x = tf.placeholder(tf.float32, shape=(1024, 1024))
但是,在官方教程页面(https://www.tensorflow.org/get_started/mnist/beginners)中,该示例使用列表作为形状而不是使用元组,如下所示。
y_ = tf.placeholder(tf.float32, [None, 10])
我知道列表和元组之间存在一些差异,例如不可变与可变。
如果列表支持元组的所有功能,那么我们是否可以总是安全地使用列表而不是元组作为函数参数?是推荐吗?
2.上面示例代码中[None,10]的含义是什么?
在上面的示例代码中,使用了[None,10]。通常使用这种表达方式吗?如果是这样,那么“无”也被认为是一种数字?
几乎所有你可以在tuple
上做的事情你也可以在列表上做。然而反之亦然,因为tuple
是不可变的,而list
是可变的。
但是有例外。因为元组是不可变的:
- 它可以用作字典中的键。
- 用于
set
。
列表旨在是同构序列,而元组是异构数据结构。此外,tuple
在性能方面略胜一筹。
来自Python's Tuples and Sequences文件:
尽管元组看起来与列表类似,但它们通常用于不同的情况并用于不同的目的。元组是不可变的,并且通常包含异构的元素序列,这些元素可以通过解包(参见本节后面部分)或索引(或者甚至是在namedtuples的情况下通过属性)来访问。
所以你的问题的答案:
当预期元组时,我们是否可以始终使用列表类型作为函数参数?
在大多数情况下,您可以使用list
而不是tuple
,但并非总是如此。但是你不必担心这一点,因为Python会在你使用list
时出现问题时提醒你。以下是您收到的错误:
TypeError: unhashable type: 'list'
例如:
>>> set([1, [1, 2]])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> {[1, 2]: 1}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
正如Moinuddin Quadri在qazxsw poi中指出的那样,你可以用一个2元素的https://stackoverflow.com/a/48038899/7505395换一个list
。
回答你的第二个问题:
根据你链接的文档,在tuple
的上下文中[None,784]
意味着一个维度是无限的,一个固定为784:
shape
https://www.tensorflow.org/get_started/mnist/beginners#implementing_the_regression
x = tf.placeholder(tf.float32, [None, 784])
不是具体的价值。这是一个x
,当我们要求TensorFlow运行计算时,我们将输入一个值。我们希望能够输入任意数量的MNIST图像,每个图像被平铺成784维向量。我们将其表示为具有placeholder
的浮点数的二维张量。(这里
shape [None, 784]
意味着尺寸可以是任何长度。)
“当预期元组时,我们总是可以使用列表类型作为函数参数吗?”
不可以。除了其他原因,该功能可能会检查类型。
None
还有一些Python语法需要元组的地方,如except子句。
>>> issubclass(ZeroDivisionError, (Exception,))
True
>>> issubclass(ZeroDivisionError, [Exception,])
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
issubclass(ZeroDivisionError, [Exception,])
TypeError: issubclass() arg 2 must be a class or tuple of classes
以上是关于当预期元组类型参数时,我们是否总能使用列表类型作为函数参数?的主要内容,如果未能解决你的问题,请参考以下文章