当预期元组类型参数时,我们是否总能使用列表类型作为函数参数?

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

以上是关于当预期元组类型参数时,我们是否总能使用列表类型作为函数参数?的主要内容,如果未能解决你的问题,请参考以下文章

OCaml 类型推断不会产生函数参数的预期类型

字典 元组

在Java中将原始类型作为输出参数传递

当类型是关联类型时,无法将类型的值转换为预期的参数类型

Python元组和序列区别是啥?

Python数据类型-元组