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