Python 为什么一个变量在一个实例中是int而在另一个实例中是字符串取决于我将它与什么进行比较?
此代码:Python 为什么一个变量在一个实例中是int而在另一个实例中是字符串取决于我将它与什么进行比较?,python,python-3.x,types,Python,Python 3.x,Types,此代码: values = ("xdr_s1_18021664256", "xdr_s1_18021664257", "xdr_s1_18021664258","xdr_s1_18021664259") list_of_strings = [] string_with_highest_number = '' max_value = 0 print(type(max_value)) for i in values: x = i.split("_")[-1] if x >
values = ("xdr_s1_18021664256", "xdr_s1_18021664257", "xdr_s1_18021664258","xdr_s1_18021664259")
list_of_strings = []
string_with_highest_number = ''
max_value = 0
print(type(max_value))
for i in values:
x = i.split("_")[-1]
if x > max_value:
max_value = i
string_with_highest_number = i
print(string_with_highest_number)
产生以下错误:
<class 'int'>
Traceback (most recent call last):
File "test_delete.py", line 9, in <module>
if x > max_value:
TypeError: '>' not supported between instances of 'str' and 'int'
<class 'int'>
Traceback (most recent call last):
File "test_delete.py", line 9, in <module>
if int(x) > max_value:
TypeError: '>' not supported between instances of 'int' and 'str'
令我惊讶的是,这次它产生了这样一个错误:
<class 'int'>
Traceback (most recent call last):
File "test_delete.py", line 9, in <module>
if x > max_value:
TypeError: '>' not supported between instances of 'str' and 'int'
<class 'int'>
Traceback (most recent call last):
File "test_delete.py", line 9, in <module>
if int(x) > max_value:
TypeError: '>' not supported between instances of 'int' and 'str'
回溯(最近一次呼叫最后一次):
文件“test_delete.py”,第9行,在
如果int(x)>最大值:
TypeError:“int”和“str”实例之间不支持“>”
因此,当我在循环之前检查max_value的类型时,它是一个整数。但是我得到一个错误,说max_值是一个字符串
有人能解释为什么会发生这种情况吗?有一种更简单的方法可以通过将
lambda
函数作为键传递给max()
,来找到最大值:
通过将lambda
函数作为键
传递到max()
,可以更简单地找到max:
打印max_value
的类型后,您可以将其重新指定给其他类型:
max_value = i
由于i
为一个字符串命名,max\u value
现在为同一个字符串命名。因此,下次在循环中执行此操作时:
if int(x) > max_value:
…它失败,因为max\u value
是一个字符串
您可能希望在存储之前将该值转换为int
,就像在比较之前将另一个值转换为int
:
if int(x) > max_value:
max_value = int(i)
你可能会困惑,因为你在思考一些更像C++的东西。p>
<>在C++中,变量是一个值生存的类型槽。分配给变量时,将值强制转换为该类型,然后将其复制到内存中的插槽中。在Python中,这一切都不是真的
在Python中,变量不是内存中的插槽,它们只是值的名称,这些值存在于它们想要存在的任何地方。当你赋值给一个变量时,你只是把这个变量换成了这个值的另一个名字。没有像C++那样的自动铸造。没有变量类型,任何变量都可以保存任何值
在不同的时间将不相关类型的值分配给同一个变量,这通常会造成混淆。如果您经常这样做,您可以使用诸如Mypy、linter或其他类型的静态分析器之类的静态类型检查器来指出潜在的混淆
你也可能会感到困惑,因为你在想一些更像计划的东西。在Scheme中,变量只是值的名称,但通常不会重新绑定它们。可以,但更常见的情况是使用更局部的绑定对它们进行阴影处理,绑定仍然存在,隐藏在堆栈的更上层。我不认为这是您的问题,因此我将不作进一步解释。在打印最大值的类型后,您可以将其重新指定给其他类型:
max_value = i
values = ("xdr_s1_18021664256", "xdr_s1_18021664257", "xdr_s1_18021664258","xdr_s1_18021664259")
list_of_strings = []
string_with_highest_number = ''
max_value = 0
print(type(max_value))
for i in values:
x = i.split("_")[-1]
if int(x) > max_value:
max_value = i // problem occurs here
string_with_highest_number = i
print(string_with_highest_number)
由于i
为一个字符串命名,max\u value
现在为同一个字符串命名。因此,下次在循环中执行此操作时:
if int(x) > max_value:
…它失败,因为max\u value
是一个字符串
您可能希望在存储之前将该值转换为int
,就像在比较之前将另一个值转换为int
:
if int(x) > max_value:
max_value = int(i)
你可能会困惑,因为你在思考一些更像C++的东西。p>
<>在C++中,变量是一个值生存的类型槽。分配给变量时,将值强制转换为该类型,然后将其复制到内存中的插槽中。在Python中,这一切都不是真的
在Python中,变量不是内存中的插槽,它们只是值的名称,这些值存在于它们想要存在的任何地方。当你赋值给一个变量时,你只是把这个变量换成了这个值的另一个名字。没有像C++那样的自动铸造。没有变量类型,任何变量都可以保存任何值
在不同的时间将不相关类型的值分配给同一个变量,这通常会造成混淆。如果您经常这样做,您可以使用诸如Mypy、linter或其他类型的静态分析器之类的静态类型检查器来指出潜在的混淆
你也可能会感到困惑,因为你在想一些更像计划的东西。在Scheme中,变量只是值的名称,但通常不会重新绑定它们。可以,但更常见的情况是使用更局部的绑定对它们进行阴影处理,绑定仍然存在,隐藏在堆栈的更上层。我不认为这是你的问题,所以我不会进一步解释
values = ("xdr_s1_18021664256", "xdr_s1_18021664257", "xdr_s1_18021664258","xdr_s1_18021664259")
list_of_strings = []
string_with_highest_number = ''
max_value = 0
print(type(max_value))
for i in values:
x = i.split("_")[-1]
if int(x) > max_value:
max_value = i // problem occurs here
string_with_highest_number = i
print(string_with_highest_number)
当您将i
分配给max\u值时,问题就出现了。第一次运行后,max\u value
接收值“xdr\u s1\u 18021664256”
,该值是一个字符串。您应该为int(x)
指定最大值
当您将i
分配给max\u值时,问题就出现了。第一次运行后,max\u value
接收值“xdr\u s1\u 18021664256”
,该值是一个字符串。您应该将最大值指定给int(x)
它可以正常复制。我可以复制复制块,%paste
将其粘贴到带有CPython 3.6的iPython中,我得到与OP完全相同的输出。您在将其存储在max_值时错过了int的转换最初,您的代码在第一次迭代时失败。现在,在将max_值绑定到字符串之后,它在第二次迭代中失败。它可以很好地复制。我可以复制复制块,%paste
将其粘贴到带有CPython 3.6的iPython中,我得到与OP完全相同的输出。您在将其存储在max_值时错过了int的转换最初,您的代码在第一次迭代时失败。现在,在将max_值绑定到字符串之后,它在第二次迭代中失败。