2016-03-01 68 views
0

我仍然处于学习Python的早期阶段,并且已经涉及这个语法​​,但我不知道它的作用。逗号跟随变量赋值如何连接?

check, expression = expression, expression.replace('()', '').replace('[]', '').replace('{}', '') 

现在我知道str.replace()函数做什么,我在到底是怎么被“检查”被分配给该级联替换功能的只是不清楚。

语境:

这里是上下文完整的代码,它的目的只是为了请检查是否括号被正确使用给定的字符串:

BRACKETS = ("{","[","(","}","]",")") 
list = [] 

#Creating a list with only the brackets in it. 
for c in expression: 
    if (c in BRACKETS) and (c in expression): 
     list.append(c) 

expression = ''.join(list) 

while expression: 
    check, expression = expression, expression.replace('()', '').replace('[]', '').replace('{}', '') 
    if expression == check: 
     return False 
return True 
+3

将'expression'的值赋给'check',而将'expression.replace ...'的值赋给'expression'。例如,如果你做'a,b = 1,2',那么a得到1,b得到2. –

回答

1

请看下面的例子:

a = 'a' 
b = 'b' 

temp = a 
a = b 
b = temp 

print(a) # 'b' 
print(b) # 'a' 

从这一点可以看出,三条线中间交换ab的值。在Python中,可以使用元组打包和解包来消除临时变量的需要。

a = 'a' 
b = 'b' 

temp_tuple = b, a # tuple packing 
print(temp_tuple) # ('b', 'a') 

a, b = temp_tuple # tuple unpacking 
print(a) # 'b' 
print(b) # 'a' 

现在,我们可以将这个打包和解包合并为一个表达式。

a = 'a' 
b = 'b' 

a, b = b, a 

print(a) # 'b' 
print(b) # 'a' 

您节省代码的expression原值为check,节省的expression更新版本回expression。然后它比较这两个变量,看expression是否被所有replace调用更改。

编辑:关于Python是否遍历代码段三次的评论,我们可以使用dis模块来反汇编测试函数的Python字节码。

from dis import dis 

def test(expression): 
    while expression: 
     check, expression = expression, expression.replace('()', '').replace('[]', '').replace('{}', '') 
     if expression == check: 
      return False 
    return True 

print dis(test) 

这将打印以下(有一些注解):

# while expression: 
4   0 SETUP_LOOP    75 (to 78) 
     >> 3 LOAD_FAST    0 (expression) # start 
      6 POP_JUMP_IF_FALSE  77    # jump to exit 

# check, expression = [...] 
5   9 LOAD_FAST    0 (expression) 
      12 LOAD_FAST    0 (expression) 
      15 LOAD_ATTR    0 (replace) 
      18 LOAD_CONST    1 ('()') 
      21 LOAD_CONST    2 ('') 
      24 CALL_FUNCTION   2 
      27 LOAD_ATTR    0 (replace) 
      30 LOAD_CONST    3 ('[]') 
      33 LOAD_CONST    2 ('') 
      36 CALL_FUNCTION   2 
      39 LOAD_ATTR    0 (replace) 
      42 LOAD_CONST    4 ('{}') 
      45 LOAD_CONST    2 ('') 
      48 CALL_FUNCTION   2 
      51 ROT_TWO    
      52 STORE_FAST    1 (check) 
      55 STORE_FAST    0 (expression) 

# if check == expression: 
6   58 LOAD_FAST    0 (expression) 
      61 LOAD_FAST    1 (check) 
      64 COMPARE_OP    2 (==) 
      67 POP_JUMP_IF_FALSE  3    # jump to start 

# return False 
7   70 LOAD_GLOBAL    1 (False) 
      73 RETURN_VALUE   
      74 JUMP_ABSOLUTE   3    # jump to start 
     >> 77 POP_BLOCK         # exit 

# return True 
8  >> 78 LOAD_GLOBAL    2 (True) 
      81 RETURN_VALUE   

从这一点可以看出,将发生以下情况:

  1. expression被装载并检查其感实性。如果True,循环立即退出。
  2. 加载,更新,交换和存储checkexpression的值。
  3. check的值与expression的值进行比较。如果False,循环跳转到开始。否则,返回False
  4. 返回True的值。这只会在循环退出时才会发生,因为expression的值在第一步中不真实。

我认为,只有真实的东西在check, expression = [...]行注意的是使用该指令ROT_TWO,这swaps the two top-most stack items.在第9行中,expression值加载的。在第12-48行上,加载并更新了expression的值,将第9行加载的值推回堆栈。然后,在第51行,这两个值被交换。

+0

这是否意味着python会遍历那段代码三次?一次将'expression'的原始值赋值为'check',并将'expression'的更新版本保存回'expression'中。第二个比较“表达式”是否发生了变化,最后一个是将“表达式”的更新版本保存到“检查”中? – bhsantos

+0

@bhsantos查看更新的答案 –

1

行你”重新提问相当于:

check  = expression 
expression = expression.replace('()', '').replace('[]', '').replace('{}', '') 

Python允许使用单个=进行多项分配。左侧的每个变量都从右侧分配一个对应的值。

0

说明

例如:

x, y = 1, 2 

x将与1 & y与2

被初始化,您还可以用它来解开元组进行初始化。对于如

>>> def foo(): return 1, 2 
>>> x = foo() 
>>> x # It is tuple 
(1, 2) 
>>> x, y = foo() # Value of 'x' is 1 and 'y' is 2 
>>> x 
1 
>>> y 
2 

你也可以用它来交换两个数字作为a, b = b, a