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

时间:2017-12-30 23:54:32

标签: python list tensorflow tuples

我一直在研究用Python编写的Tensorflow API。我有两个问题。

1。当预期元组时,我们是否可以始终使用列表类型作为函数参数?

如果我们查看有关tf.placeholder及其示例(https://www.tensorflow.org/api_docs/python/tf/placeholder)的官方API定义,我们会看到此函数的第二个参数是" shape"。在示例代码中,我们可以看到元组用于提供形状信息作为参数,如下所示。

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]。通常使用这种表达方式吗?如果是这样,那么"无"还算是一种数字?

3 个答案:

答案 0 :(得分:4)

您可以在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'

答案 1 :(得分:1)

正如MoinuddinQuadri在https://stackoverflow.com/a/48038899/7505395中注意到此用法,您可以为list交换2个元素tuple

回答第二次问题:

根据您关联的文档,在[None,784]的上下文中shape表示一个维度无限制,一个维度固定为784:

https://www.tensorflow.org/get_started/mnist/beginners#implementing_the_regression

  

x = tf.placeholder(tf.float32, [None, 784])

     

x不是特定值。它是placeholder,当我们要求TensorFlow运行计算时,我们将输入一个值。我们希望能够输入任意数量的MNIST图像,每个图像被平铺成784维向量。我们将其表示为浮点数的二维张量,shape [None, 784]

     

(此处None表示维度可以是任意长度。)

答案 2 :(得分:1)

&#34;当预期元组时,我们是否可以始终使用列表类型作为函数参数?&#34;

没有。除了其他原因,该功能可以检查类型。

>>> 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

还有一些Python语法需要元组的地方,如except子句。

>>> try: 1/0
except (Exception,) as e: print(e)

division by zero
>>> try: 1/0
except [Exception] as e: print(e)

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    try: 1/0
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#2>", line 2, in <module>
    except [Exception] as e: print(e)
TypeError: catching classes that do not inherit from BaseException is not allowed