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_值绑定到字符串之后,它在第二次迭代中失败。