Python 使用_uinit _u为四个向量创建一个类

Python 使用_uinit _u为四个向量创建一个类,python,python-2.7,numpy,initialization,Python,Python 2.7,Numpy,Initialization,我的代码在P0,P1中运行良好,但在P2中不起作用:(有人能发现我的错误吗?r甚至不在参数列表中,为什么?只需添加它: import numpy as np class FourVector: """ This document is a demonstration of how to create a class of Four vector """ def __init__(self,ct=0,x=0,y=0,z=0): self.a=(ct,x,y,z)


我的代码在
P0
P1
中运行良好,但在
P2
中不起作用:(有人能发现我的错误吗?

r
甚至不在参数列表中,为什么?只需添加它:

import numpy as np
class FourVector:
""" This document is a demonstration of how to create a class of Four vector """
    def __init__(self,ct=0,x=0,y=0,z=0):
        self.a=(ct,x,y,z)
        self.r=(ct,r=[x,y,z])

P0 = FourVector()
print P0.a

P1 = FourVector(ct=9,x=1,y=2,z=4)
print P1.a

P2 = FourVector(ct=99.9,r=[1,2,4])

r
甚至不在参数列表中,为什么?只需添加它:

import numpy as np
class FourVector:
""" This document is a demonstration of how to create a class of Four vector """
    def __init__(self,ct=0,x=0,y=0,z=0):
        self.a=(ct,x,y,z)
        self.r=(ct,r=[x,y,z])

P0 = FourVector()
print P0.a

P1 = FourVector(ct=9,x=1,y=2,z=4)
print P1.a

P2 = FourVector(ct=99.9,r=[1,2,4])

您的
\uuu init\uuu
方法中没有
r
参数:

def __init__(self,ct=0,x=0,y=0,z=0, r=None)

您的
\uuu init\uuu
方法中没有
r
参数:

def __init__(self,ct=0,x=0,y=0,z=0, r=None)


你的代码甚至不应该编译。你期望什么
self.r=(ct,r=[x,y,z])
该怎么办?至于P2,当构造函数不接受具有该名称的参数时,您希望将
r
参数传递给构造函数怎么办?用户:Arihh,是的,您是对的。对于Bi-Rico:Numpy arrayPlease,请避免将文本作为图像发布;下次,复制并粘贴文本,而不是提供屏幕截图。您的代码甚至都不应该编译。你期望self.r=(ct,r=[x,y,z])该怎么办?至于P2,当构造函数没有使用该名称的参数时,你希望将
r
参数传递给构造函数怎么办?对用户:Arihh,是的,你是对的。对于biRico:Numpy arrayPlease,请避免将文本作为图像发布;下次,复制并粘贴文本,而不是提供屏幕截图。我是stru正在努力创建另一层……”就像上面所做的那样,通过灵活地使用if语句声明r!=[],我是一个真正的编程新手,只需要更多的练习!
if!=[]
意味着“如果您将参数
r
传递给
\uuuuu init\uuuu
“请注意,这不是分配的正确解决方案。空间组件应该存储在一个numpy数组中。此外,使用可变的默认参数是一个坏主意,即使您没有对其进行突变。这就是说,这解决了即时错误。而不是
r=[]
if r!=[]:
,我建议
r=None
如果r不是None:
。请参阅详细解释。我正在努力创建另一层…”就像上面所做的那样,通过灵活使用if语句声明r!=[],我是一个真正的编程新手,只需要更多的练习!
如果r!=[
的意思是如果您将参数
r
传递给
\uuuu init\uuuu
“请注意,这不是赋值的正确解决方案。空间组件应该存储在numpy数组中。此外,使用可变默认参数是个坏主意,即使您没有对其进行突变。也就是说,这解决了直接的错误。而不是
r=[]
如果r!=[]:
,我建议
r=None
如果r不是None:
。有关详细说明,请参阅。对于默认参数
r
,最好使用
None
,这样您就不会意外地修改列表并得到奇怪的错误。这就是@user2357112所指的:\@askewchan因为r'是在类初始化时定义的?我可能遗漏了一些东西,其他的都是一样的,在我提供的代码中使用r=None可以很好地工作,如果由于我不知道的原因有非零机会创建错误,我将开始使用None默认值。谢谢。对于默认参数
r
,可能最好使用
None
,所以您不会意外地修改列表并得到奇怪的bug。这就是@user2357112所指的:\@askewchan我们不应该避免这个问题吗,因为“r”是在类初始化时定义的吗?我可能遗漏了一些东西,其他所有的都是一样的,在我提供的代码中使用r=None可以很好地工作,并且如果由于某些原因有非零的机会创建bugg我不知道,我将开始使用无默认值。谢谢。:)但是OP可能还没有:PNo,我不觉得有必要提及它,因为
\uuuu init\uuuu
是一种特殊的方法,当类被实例化时,它只会被调用一次。@aIKid:错。
\uuu init\uuuu
将被调用来实例化每个实例,并且每个实例将共享
r
的相同默认列表。这种ing就是为什么你不使用可变的默认参数,即使你认为它应该是安全的。啊,真的吗?我不知道。:)但是OP可能还没有:PNo,我觉得没有必要提及它,因为
\uuu init\uuuu
是一个特殊的方法,当类被实例化时,它只会被调用一次。@aIKid:错。
\uu init\uuu
将是cal导致实例化每个实例,每个实例将共享相同的
r
默认列表。这就是为什么不使用可变默认参数的原因,即使您认为它应该是安全的。啊,真的吗?我不知道。