首先,請注意type(1)
給你type(Integer(1))
因爲SymPy現場包裝在Integer()
自動整型常量(這是爲了避免其中1/2
評估爲0.5
而不是Rational(1, 2)
)。但是請注意,在常規Python會話type(1)
中是int
。
SymPy中有幾個對象實現爲單例,意味着只有一個實例存在。你可以看到這一切在S
對象
In [13]: dir(S)
Out[13]:
['Catalan',
'ComplexInfinity',
'Complexes',
'EulerGamma',
'Exp1',
'GoldenRatio',
'Half',
'IdentityFunction',
'ImaginaryUnit',
'Infinity',
'NaN',
'Naturals0',
'NegativeInfinity',
'NegativeOne',
'One',
'Pi',
'Reals',
'Zero',
'__call__',
'__class__',
'__delattr__',
'__doc__',
'__format__',
'__getattr__',
'__getattribute__',
'__hash__',
'__init__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__slots__',
'__str__',
'__subclasshook__',
'_classes_to_install',
'false',
'register',
'true']
(忽略與_
開始的那些;這些都是Python的內部方法)
這樣做的原因是,這些對象使用了很多。 0,1和-1是很常見的對象。每當你寫1/x
時,它在內部表示爲Pow(x, -1)
。 x - y
表示爲Add(x, Mul(-1, y))
。對於0,它經常出現在各種符號計算中。 1也很常見。通過擁有一個實例,SymPy支持兩種優化。首先,它節省了內存。其次,你可以使用is
進行比較,比如x is S.One
。因爲只有一個實例可以存在Integer(1)
總是與S.One
相同。
(也,我要指出,一些S
對象實際上並沒有那麼普遍,像Catalan
和EulerGamma
。我猜他們增加了更多的方便性大於任何東西)
到底什麼你做把'type(1)'變成'int'以外的任何東西? – user2357112
@ user2357112剛剛導入sympy模塊 –
導入sympy不會像這樣解析器。 'type(1)'將始終構造一個實際的Python整數,並將其類型設置爲'int'。 – user2357112