缺乏对多变量赋值的理解Python

Cra*_*ezz 5 python tuples list-comprehension list

我是Python的新手(以Java为基础).我在第3章中发现了Dive Into Python书籍Multi-Variable Assignment.也许你们中的一些人可以帮助我理解这段代码中发生的事情:

>>> params = {1:'a', 2:'b', 3:'c'}
>>> params.items() # To display list of tuples of the form (key, value).
[(1, 'a'), (2, 'b'), (3, 'c')]

>>> [a for b, a in params.items()] #1
['a', 'b', 'c']
>>> [a for a, a in params.items()] #2
['a', 'b', 'c']
>>> [a for a, b in params.items()] #3
[ 1 ,  2 ,  3 ]
>>> [a for b, b in params.items()] #4
[ 3 ,  3 ,  3 ]
Run Code Online (Sandbox Code Playgroud)

我的理解迄今已是#1#2具有相同的输出,即显示元组的值.#3显示元组的键,#4只显示元组列表中的最后一个键.

我不明白上面每个案例使用变量a和变量b:

  1. a for b, a ... - >显示值
  2. a for a, a ... - >显示值
  3. a for a, b ... - >显示键
  4. a for b, b ... - >显示最后一个键

任何人都可以为上面的每个案例详细说明循环的流程吗?

Bjö*_*lex 8

您在那里使用的列表理解大致翻译如下:

[a for b, a in params.items()]
Run Code Online (Sandbox Code Playgroud)

result = []
for item in params.items():
    b = item[0]
    a = item[1]
    result.append(a)
Run Code Online (Sandbox Code Playgroud)
[a for a, a in params.items()]
Run Code Online (Sandbox Code Playgroud)

result = []
for item in params.items():
    a = item[0]
    a = item[1] # overwrites previous value of a, hence this yields values, 
                # not keys
    result.append(a)
Run Code Online (Sandbox Code Playgroud)
[a for a, b in params.items()]
Run Code Online (Sandbox Code Playgroud)

result = []
for item in params.items():
    a = item[0]
    b = item[1]
    result.append(a)
Run Code Online (Sandbox Code Playgroud)
[a for b, b in params.items()]
Run Code Online (Sandbox Code Playgroud)

result = []
for item in params.items():
    b = item[0]
    b = item[1]
    result.append(a) # note use of a here, which was not assigned
Run Code Online (Sandbox Code Playgroud)

最后一个是特别的.它之所以有效,是因为您a在前一个语句中使用了该变量,并且已分配给它的最后一个值是3.如果先执行此语句,则会出错.


Ign*_*ams 6

在所有四种情况下,元组中的名称按顺序从序列中绑定到对中的每个元素.第四个例子是Python 2.x中的(错误)行为的一个例子; 该名称被绑定到它拥有的最后一个对象,甚至在LC之外.此行为在3.x中得到修复.

>>> [x for x in (1, 2, 3)]
[1, 2, 3]
>>> x
3

3>> [x for x in (1, 2, 3)]
[1, 2, 3]
3>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)