python中的双重赋值

时间:2014-04-16 01:54:37

标签: python

请参阅代码here

move_from, move_to = [
        (item['path'], prev_item['path']),
        (prev_item['path'], item['path']),
    ][item['op'] == 'add']

分配给move_from和move_to的内容。看起来像双重任务,但是没有看到右边的两个(我是非python程序员)我试图移植到Javascript,它会是什么样子?

感谢。

4 个答案:

答案 0 :(得分:5)

这个

[
(item['path'], prev_item['path']),
(prev_item['path'], item['path']),
]

是一个Python列表。第一个(0)项是

(item['path'], prev_item['path'])

,第二个(1)是

(prev_item['path'], item['path'])

这里的布尔值

[item['op'] == 'add']

评估为True的假(1或0),以便选择其中一个项目。

例如,如果item ['op']等于'add',则结果为

move_from, move_to = prev_item['path'], item['path']

编辑: 你问了JS代码。这可能会这样做。请注意,我假设大多数变量都是全局变量,因为我不知道您将在何种上下文中使用它。

String.prototype.rsplit = function(sep, maxsplit) {
    var split = this.split(sep);
    return maxsplit ? [ split.slice(0, -maxsplit).join(sep) ].concat(split.slice(-maxsplit)) : split;
}

function _optimize_using_move(prev_item, item) {
    prev_item['op'] = 'move';
    if (item['op'] == 'add') {
        prev_item['from'] = prev_item['path'];
        prev_item['path'] = item['path'];
    } else {
        var parts = move_from.rsplit('/', 1);
        head = parts[0];
        move_from = parts[1];
        move_from = int(item['path']) - 1;
        prev_item['from'] = head + '/' + item['path'];
        prev_item['path'] = prev_item['path'];
    }
}

答案 1 :(得分:3)

将其拆分为两个步骤。

第一

print ['a', 'b'][0 == 1]
# 'a'
print ['a', 'b'][0 == 0]
# 'b'

在python中,如果使用布尔值作为数组索引,则False被视为0,True被视为1.因此,在您的情况下,

的值
[
    (item['path'], prev_item['path']),
    (prev_item['path'], item['path']),
][item['op'] == 'add']
如果(item['path'], prev_item['path'])不是item['op'],则

应为"add"(prev_item['path'], item['path'])

然后是作业

a, b = (0, 1)

a = 0b = 1非常相似。在您的情况下,如果item['op']等于"add",则结果为

move_from = prev_item['path']
move_to = item['path']

虽然使用布尔值是完全有效的,但我不建议这样的程序。更常见的惯例是使用CONSEQUENCE if PREDICATE else ALTERNATIVE(如C语言中的PREDICATE ? CONSEQUENCE : ALTERNATIVE

 move_from, move_to = (prev_item['path'], item['path']) \
    if item['op'] == 'add' else \
    (item['path'], prev_item['path'])

由于JS中没有元组赋值,我认为一种简单的方法是

if (item['op'] === 'add') {
    move_from = prev_item['path'];
    move_to = item['path'];
} else {
    move_from = item['path'];
    move_to = prev_item['path'];
}

答案 2 :(得分:1)

正如sdolan所说,[item['op'] == 'add']将选择使用两个元组中的哪一个来引用move_from和move_to。

自己尝试这种简化,并将[True]切换为[False]进行比较:

move_from, move_to = [(1, 2), (3, 4),][True]
print(move_from)
print(move_to)

答案 3 :(得分:0)

你在这里看到的是pythonist经常在代码高尔夫中使用的小技巧。 让我们打破这段代码。

move_from, move_to = [
        (item['path'], prev_item['path']),
        (prev_item['path'], item['path']),
    ][item['op'] == 'add']

第一:

[item['op'] == 'add']

这样做会将item['op']add进行比较 然后,该比较返回布尔值,即TrueFalse
在python中TrueFalse基本上分别等同于10

现在基本上我们有:

move_from, move_to = [
                 (item['path'], prev_item['path']),
                 (prev_item['path'], item['path'])
          ][<0 or 1>]

现在,根据比较是真还是假,返回此数组的第一个或第二个元素。

在这两种情况下,返回的对象(或从数组/列表中选择的)是以下形式的元组: (a, b)。 现在Python做了一个名为tuple unpacking的东西。

所以当你看到:

move_from, move_to = (a, b)

它实质上意味着:

move_from = a

move_to = b

我希望澄清这段代码的工作原理。