我只是想知道为什么当我接受像int这样的字符串的整数时('字符串')为什么你在python 3.2中收到一个值错误而不是类型错误。我看到类型错误的定义在python站点上定义如下:当操作或函数应用于不适当类型的对象时引发。关联值是一个字符串,提供有关类型不匹配的详细信息。
是不是运算符,字符串是不合适的类型?当我这样做时,我收到一个ValueError,并且不明白其原因。
这是代码 因此,当我实例化具有字符串的类来尝试并故意得到错误时,我会收到一个valueerror而不是我期望的类型。
class Card:
#attributes
list_rank= ["","Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"]
list_suit={"d":"diamonds","c":"clubs","h":"hearts","s":"spades"}
#initialize rank and suit
def __init__(self,rank,suit):
self.rank=int(rank)
self.suit=suit
#return the rank of the card
def getRank(self):
return(self.list_rank[self.rank])
#return the suit of the card
def getSuit(self):
return(self.list_suit[self.suit])
#value of the cards
def bjValue(self):
if(self.rank<10):
return(self.rank)
else:
return(10)
#return the rank and suit of the card
def __str__(self):
return (self.list_rank[self.rank]+" of "+self.list_suit[self.suit])
答案 0 :(得分:5)
要理解差异,您必须了解类型和值之间的区别。 &#34; abc&#34;的类型是字符串,您可以通过运行
来检查type("abc") # -> string
文字"abc"
的值只是值本身。如果您的表达式为"ab" + "c"
,则值也为"abc"
。
这就是为什么你得到ValueError
而不是TypeError
的原因; int
期望一个string
,你给它了 - 所以它是正确的类型 - 但value
必须是可以解释的东西作为整数,"abc"
显然不是整数。
要尝试这一点,请参阅:
之间的区别int('abc')
# throws:
# ValueError: invalid literal for int() with base 10: 'abc'
和
int(None)
# throws:
# TypeError: int() argument must be a string or a number, not 'NoneType'
然而,"abc"
不会立即看起来像一个整数这一事实并不能阻止我们将其解释为一个整数。在另一个base中,它仍然可以解释为数字。
例如:您可能知道,二进制数字仅使用0
和1
s,十六进制数通常使用数字0
- 9
表示以及字母a
- f
。 int
函数接受一个可选参数,告诉它使用哪个库,所以如果我们再尝试解释"abc"
但是作为十六进制数,我们得到:
int('abc', base=16)
# returns 2748
答案 1 :(得分:3)
因为int()
接受字符串作为参数,例如int('1')
将输出1
。因此'1'
是合适的值,但'a'
不是
答案 2 :(得分:2)
TL; DR:如果您提供的数据是您尝试使用的功能的正确类型但值,则会获得ValueError
没有意义。
如果您尝试使用的功能不了解如何处理您提供的类型数据,则会获得TypeError
。
示例:
例如:
int('123')
>>>>123
int('somestring')
>>>>Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'somestring'
所以它试图使用基数10将字符串转换为int,其中只有字符0-9才有意义。基本上Python说'#34;我期待一个字符串,但我不明白字符串&#34;
将其与此相比:
>>>>int('FF', base=16) #hexadecimal
255
>>>>int('9', base=8) # can only use 0-7 in octal
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'somestring'
>>>>int('somestring', base=36)
2913141654103084L
(Base 36使用0-9然后a-z作为有效数字字符)
如果您尝试完全使用错误的类型,例如int( {'apple':1} )
,那么您会收到一条TypeError
和一条有用的消息,告诉您它为什么无效:
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'dict'