Python:输入相同但输出不同的列表

2024-10-04 01:35:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我将一个列表传递给一个函数并查看输出。当列表被硬编码时,我就得到了预期的输出。但是,当我从字符串构建列表,并将具有相同内容的列表传递给函数时,我没有预期的输出。在

第一次呼叫:

tech = [ "Django", "Zend", "SQLite", "foo" ]

for tech_item in tech:
    print( test_main( tech_item ) )

第二次呼叫:

^{pr2}$

因此,输入看起来是相同的,但是输出是不同的。在

当我比较两个列表的内容(将第二个列表重命名为tech2)时,我有:

print( tech[0], tech2[0] ) #Django Django
print( tech[0] == tech2[0] ) #True
print( type(tech[0]), type(tech2[0]) ) #<class 'str'> <class 'str'>
print( len(tech[0]), len(tech2[0]) ) #6 6

我错过了什么? 你对如何找到/解决这个问题有什么线索吗?在

编辑:

第一个案例的输出:

frameworks
frameworks
SQL
None

第二种情况的输出:

None
None
None
None

测试主要功能

我给你test_main函数,但恐怕会把你搞糊涂。 所以每次“寻找”都是一样的。但“tmp”在这两种情况下是不同的。在

def test_main( looking_for ):
    global tmp
    tmp = None

    get_recursively( languages_tech, looking_for )

    return tmp

递归获取函数

def get_recursively( data, looking_for, last_key="" ):
    if not isinstance( data, (list, dict) ):
        if data is looking_for: #item
            global tmp
            tmp = last_key
    else:
        if isinstance( data, dict ): #Dictionaries
            for key, value in data.items():
                get_recursively( value, looking_for, key )
        else:
            for item in data: #list
                get_recursively( item, looking_for, last_key )

语言技术

languages = { "languages": [
"Ruby", "Python", "JavaScript", "ASP.NET", "Java", "C", "C++", "C#", "Swift", "PHP", "Visual Basic", "Bash" ] }

frameworks = { "frameworks" : [
"Django", "Flask", "React", "React Native", "Vue", "Ember", "Meteor", "AngularJS", "Express" , "Laravel", "Symfony", "Zend", "Ruby on Rails" ] }

databases = { "databases" : [
{ "SQL": ["MariaDB", "MySQL", "SQLite", "PostgreSQL", "Oracle", "MSSQL Server"] },
{ "NoSQL": ["Cassandra", "CouchDB", "MongoDB", "Neo4j", "OrientDB", "Redis", "Elasticsearch"] },
{ "ORM Framework": [ "SQLAlchemy", "Django ORM" ] } ] }

languages_tech = { "languages_tech": [ languages, frameworks, databases ]  }

Tags: djangokey函数none列表fordataitem
1条回答
网友
1楼 · 发布于 2024-10-04 01:35:18

简短回答

您的get_recursively()函数中的以下行是错误的

if data is looking_for:

用这个代替

^{pr2}$

回答

仅当a和{}具有相同的id时,a is b将计算为{}。也就是说

(a is b) == (id(a) == id(b))

默认情况下,字符串文本被分配相同的id。例如

>>> a = "Trebuchet"
>>> b = "Trebuchet"
>>> id(a), id(b)
(4416391792, 4416391792)

注意,id都是4416391792。这也包含到lists中(即使列表不是同一个对象,因此没有相同的id)。在

>>> a = ["Trebuchet", "Catapult", "Ballista"]
>>> b = ["Trebuchet", "Catapult", "Ballista"]
>>> id(a), id(b)
(4416392200, 4416861640)

>>> id(a[0]), id(b[0])          
(4416391792, 4416391792)

请注意,4416391792与上一个示例中的数字完全相同。这将显示字符串如何指向同一对象。在

但是当你引入str.split()函数时。。。在

>>> a = "Trebuchet;Catapult;Ballista".split(';')
>>> b = ["Trebuchet", "Catapult", "Ballista"]
>>> id(a[0]), id(b[0])          
(4416392240, 4416391792)

id(b[0])仍然是4416391792,我们以前见过。但是现在,请注意,str.split()创建了一个新的字符串对象,列表中有id = 4416392240!!!在

这是data is looking_for计算结果为false的原理的基础。

当然,is也有它的优点。例如,我们做a is None,而不是a == Noneread more)。但区分何时使用is和何时使用{}是很重要的。比较字符串、列表或元组等值的文字时,使用==。在


进一步阅读:

Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?

Another example where variables can have congruent string literals but different ^{}s.

相关问题 更多 >