2016-03-01 20 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