Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当一个元组在python中只有一个条目时,逗号运算符的作用是什么?_Python_Python 3.x_Pytorch - Fatal编程技术网

当一个元组在python中只有一个条目时,逗号运算符的作用是什么?

当一个元组在python中只有一个条目时,逗号运算符的作用是什么?,python,python-3.x,pytorch,Python,Python 3.x,Pytorch,这段代码取自其中一段代码,我刚刚删除了一些不重要的部分,这样它就不会出错,并添加了一些打印语句。我的问题是,为什么我提供的两个打印语句的结果略有不同?这是一个在后半部分没有任何内容的元组吗?我被赋值运算符前面的逗号弄糊涂了 import torch class MyReLU(torch.autograd.Function): @staticmethod def forward(ctx, input): ctx.save_for_backward(input)

这段代码取自其中一段代码,我刚刚删除了一些不重要的部分,这样它就不会出错,并添加了一些打印语句。我的问题是,为什么我提供的两个打印语句的结果略有不同?这是一个在后半部分没有任何内容的元组吗?我被赋值运算符前面的逗号弄糊涂了

import torch

class MyReLU(torch.autograd.Function):
    @staticmethod
    def forward(ctx, input):
        ctx.save_for_backward(input)
        return input.clamp(min=0)

    @staticmethod
    def backward(ctx, grad_output):
        input, = ctx.saved_tensors
        print("ctx ", ctx.saved_tensors)
        print("inputs ", input)
        grad_input = grad_output.clone()
        grad_input[input < 0] = 0
        return grad_input

relu = MyReLU.apply
relu = MyReLU.apply
y_pred = relu(x.mm(w1)).mm(w2)
loss = (y_pred - y).pow(2).sum()
loss.backward()
导入火炬
MyReLU类(torch.autograd.Function):
@静力学方法
def前进档(ctx,输入):
ctx.save_for_backward(输入)
返回输入。钳位(最小值=0)
@静力学方法
def向后(ctx、梯度输出):
输入,=ctx.u张量
打印(“ctx”,ctx.saved_张量)
打印(“输入”,输入)
grad\u input=grad\u output.clone()
梯度输入[输入<0]=0
返回梯度输入
relu=MyReLU.apply
relu=MyReLU.apply
y_pred=relu(x.mm(w1)).mm(w2)
损失=(y_pred-y).pow(2).sum()
loss.backward()
输出

ctx  (tensor([[-34.2381,  18.6334,   8.8368,  ...,  13.7337, -31.5657, -11.8838],
        [-25.5597,  -6.2847,   9.9412,  ..., -75.0621,   5.0451, -32.9348],
        [-56.6591, -40.0830,   2.4311,  ...,  -2.8988, -18.9742, -74.0132],
        ...,
        [ -6.4023, -30.3526, -73.9649,  ...,   1.8587, -23.9617, -11.6951],
        [ -3.6425,  34.5828,  27.7200,  ..., -34.3878, -19.7250,  11.1960],
        [ 16.0137, -24.0628,  14.4008,  ...,  -5.4443,   9.9499, -18.1259]],
       grad_fn=<MmBackward>),)
inputs  tensor([[-34.2381,  18.6334,   8.8368,  ...,  13.7337, -31.5657, -11.8838],
        [-25.5597,  -6.2847,   9.9412,  ..., -75.0621,   5.0451, -32.9348],
        [-56.6591, -40.0830,   2.4311,  ...,  -2.8988, -18.9742, -74.0132],
        ...,
        [ -6.4023, -30.3526, -73.9649,  ...,   1.8587, -23.9617, -11.6951],
        [ -3.6425,  34.5828,  27.7200,  ..., -34.3878, -19.7250,  11.1960],
        [ 16.0137, -24.0628,  14.4008,  ...,  -5.4443,   9.9499, -18.1259]],
       grad_fn=<MmBackward>)
ctx(张量([-34.2381,18.6334,8.8368,…,13.7337,-31.5657,-11.8838],
[-25.5597,  -6.2847,   9.9412,  ..., -75.0621,   5.0451, -32.9348],
[-56.6591, -40.0830,   2.4311,  ...,  -2.8988, -18.9742, -74.0132],
...,
[ -6.4023, -30.3526, -73.9649,  ...,   1.8587, -23.9617, -11.6951],
[ -3.6425,  34.5828,  27.7200,  ..., -34.3878, -19.7250,  11.1960],
[ 16.0137, -24.0628,  14.4008,  ...,  -5.4443,   9.9499, -18.1259]],
grad_fn=),)
输入张量([-34.2381,18.6334,8.8368,…,13.7337,-31.5657,-11.8838],
[-25.5597,  -6.2847,   9.9412,  ..., -75.0621,   5.0451, -32.9348],
[-56.6591, -40.0830,   2.4311,  ...,  -2.8988, -18.9742, -74.0132],
...,
[ -6.4023, -30.3526, -73.9649,  ...,   1.8587, -23.9617, -11.6951],
[ -3.6425,  34.5828,  27.7200,  ..., -34.3878, -19.7250,  11.1960],
[ 16.0137, -24.0628,  14.4008,  ...,  -5.4443,   9.9499, -18.1259]],
grad_fn=)

这只是解包单个元素列表或元组的一种边缘情况

a, = [1]
print(type(a), a)
# <class 'int'> 1
元组也是如此:

a, = (1,)  # have to use , with literal single-tuples, because (1) is just 1
print(type(a), a)
# <class 'int'> 1

a = (1,)  # have to use , with literal single-tuples, because (1) is just 1
print(type(a), a)
# <class 'tuple'> (1,)
a,=(1,)#必须与文本单元组一起使用,因为(1)仅为1
打印(类型(a),a)
#  1
a=(1,)#必须与文字单元组一起使用,因为(1)仅为1
打印(类型(a),a)
#  (1,)

这只是解包单个元素列表或元组的一种边缘情况

a, = [1]
print(type(a), a)
# <class 'int'> 1
元组也是如此:

a, = (1,)  # have to use , with literal single-tuples, because (1) is just 1
print(type(a), a)
# <class 'int'> 1

a = (1,)  # have to use , with literal single-tuples, because (1) is just 1
print(type(a), a)
# <class 'tuple'> (1,)
a,=(1,)#必须与文本单元组一起使用,因为(1)仅为1
打印(类型(a),a)
#  1
a=(1,)#必须与文字单元组一起使用,因为(1)仅为1
打印(类型(a),a)
#  (1,)
(a,b)是两个元组,(a,b,c)是三个元组,(a,b,c,d)是四个元组

相反(a)将是一个元组。但这与例如
(1+2)/3
冲突,因为您不能划分元组。由于一个元组很少见,而数学表达式中的参数也很常见,
()
不是元组。并且需要额外的尾随,如
(a,)

注:(a,b)和(a,b,c)也起作用

解包元组也是如此:

a、 =元组

解压元组并将a设置为第一个(也是唯一的)项。

(a,b)是两个元组,(a,b,c)是三个元组,(a,b,c,d)是四个元组

相反(a)将是一个元组。但这与例如
(1+2)/3
冲突,因为您不能划分元组。由于一个元组很少见,而数学表达式中的参数也很常见,
()
不是元组。并且需要额外的尾随,如
(a,)

注:(a,b)和(a,b,c)也起作用

解包元组也是如此:

a、 =元组


解压元组并将a设置为第一个(也是唯一的)项。

必须使用
,因为
(x)
只是
x
@tobias\k打印的似乎是
(x,)
,这与
x
不同。没有“后半部分”。元组是包含0个或多个元素的不可变容器。使用逗号运算符创建元组,括号仅用于区分创建逗号的元组与其他逗号(例如,分隔函数参数的元组:
f(2,3,4)
vs
f((2,3,4)
),作为特例,空元组仅为括号(因为空括号在其他方面不是有效的表达式。)之所以需要
,是因为
(x)
只是
x
@tobias\k打印的似乎是
(x,)
,这与
x
不同。没有“后半部分”。元组是包含0个或多个元素的不可变容器。您可以使用逗号运算符创建元组,括号仅用于区分创建逗号的元组与其他逗号(例如,分隔函数参数的元组:
f(2,3,4)
vs
f((2,3,4)
)作为一个特例,空元组就是圆括号(因为空括号不是有效的表达式)。我会使用
(1,)
来更好地匹配这个例子。我也不会把它称为边缘情况。它只是“a”,case-这是正常的和预期的行为。@kabanus好的,已更新。但我仍然认为这是一种边缘情况,因为除了单元素元组之外,其他任何东西都不需要尾随逗号。我知道你是从哪里来的。我的意思是,如果打印单元素元组,这就是我预期的结果-输出为“look”就像一个元组,在这种情况下是一个单元素的。@kabanus我同意输出,但我相信问题的前提是赋值行上的
,而不是输出中的
,这只是我的观点。你已经有了我的投票:)我会使用
(1,)
来更好地匹配示例。我也不会把这称为边缘案例。这只是一个“案例”,完全是正常和预期的行为。@kabanus好的,更新了。但我还是