Python 为什么int(string)给出值错误
我只是想知道为什么当我使用int('string')这样的字符串的整数时,为什么在Python3.2中会收到一个值错误,而不是一个类型错误。我看到python站点上对类型错误的定义如下:当操作或函数应用于不适当类型的对象时引发。关联的值是一个字符串,提供有关类型不匹配的详细信息 int不是运算符,字符串是不合适的类型吗?当我这样做时,我收到一个ValueError,并且不理解其原因 这是密码 因此,当我用一个列组实例化这个类,该列组中有一个字符串要尝试并故意获取一个错误时,我会收到一个valueerror,而不是我所期望的类型Python 为什么int(string)给出值错误,python,typeerror,Python,Typeerror,我只是想知道为什么当我使用int('string')这样的字符串的整数时,为什么在Python3.2中会收到一个值错误,而不是一个类型错误。我看到python站点上对类型错误的定义如下:当操作或函数应用于不适当类型的对象时引发。关联的值是一个字符串,提供有关类型不匹配的详细信息 int不是运算符,字符串是不合适的类型吗?当我这样做时,我收到一个ValueError,并且不理解其原因 这是密码 因此,当我用一个列组实例化这个类,该列组中有一个字符串要尝试并故意获取一个错误时,我会收到一个value
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])
类卡:
#属性
排名=[,“A”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“杰克”,“女王”,“国王”]
清单(d):"钻石","c"梅花","h"红心","s"黑桃"}
#初始化等级和诉讼
定义初始(自我、等级、套装):
self.rank=int(秩)
西服
#返回卡的等级
def getRank(自我):
返回(self.list\u秩[self.rank])
#把卡片的套装退回来
def getSuit(自我):
返回(self.list\u suit[self.suit])
#卡的价值
定义值(自身):
如果(self.rank因为int()
接受字符串作为参数,例如int('1')
将输出1
。因此'1'
是一个合适的值,但'a'要理解类型和值之间的差异,您必须理解类型和值之间的差异是字符串,您可以通过运行
type("abc") # -> string
文本“abc”
的值只是值本身。如果您有一个类似“ab”+“c”
的表达式,那么该值也将是“abc”
这就是为什么你得到的是ValueError
而不是TypeError
;int
需要一个字符串,你给了它-所以它是正确的类型-但是值必须是可以解释为整数的东西,显然“abc”
不是整数
要尝试此方法,请参见以下内容之间的区别:
int('abc')
# throws:
# ValueError: invalid literal for int() with base 10: 'abc'
及
“abc”
看起来并不是一个整数,但这一事实并不能阻止我们将其解释为一。在另一种情况下,它仍然可以解释为一个数字
例如:您可能知道,二进制数只使用0
s和1
s,十六进制数通常使用数字0
-9
和字母a
-f
表示。函数采用可选参数,告诉它使用哪个基,因此如果我们尝试解释de>“abc”
但作为十六进制数,我们得到:
int('abc', base=16)
# returns 2748
TL;DR:如果您提供的数据是您试图使用的函数的正确类型,但是值没有意义,那么您会得到一个值错误。
如果您试图使用的函数不理解如何处理您提供的数据类型,则会出现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'
每个字符都有一个称为ASCII的整数,你知道吗?值得一提的是,Python 2.x也会引发一个ValueError
。你真的将这个函数应用于任何东西吗?int
不是运算符,它是一个内置类。当你调用int(x)时
您正在调用该类的构造函数。请注意,'string'
是以36为基数的有效数字,即int('string',base=36)
的计算结果为1743045676
(十进制)。;-)@user3630439关键是将字符串传递给int
构造函数不是类型错误-许多字符串都是有效的(例如“12345”
)。因此为字符串引发类型错误是没有意义的(但为例如None
引发类型错误是完全合理的,正如AndréLaszlo所演示的)。因为我刚才说的'a'
是一个错误的值,因为它不是整数,但'1'
是一个可接受的值。请记住,两者都有相同的类型啊,这很有意义。非常感谢!非常感谢。现在这更有意义了。我想我不是真的在想。再次感谢。非常感谢您的解释!非常感谢!
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'
>>>>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
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'dict'