我是 python 的新手,我不確定為什么我們在執行緒的 args 中使用逗號 ',' 例如:
import threading
import time
semaphore = threading.BoundedSemaphore(value=5)
def access(thread_number):
print("{}: Trying access...".format(thread_number))
semaphore.acquire()
print("{}: Access granted!".format(thread_number))
print("{}: waiting 5 seconds...".format(thread_number))
time.sleep(5)
semaphore.release()
print("{}: Releasing!...".format(thread_number))
for thread_number in range(10):
t = threading.Thread(target=access, args=(thread_number,))
t.start()
為什么有效?"args = (thread_number,)" 如何在末尾需要逗號?
uj5u.com熱心網友回復:
唉,這不是特別容易 - 它位于 Python 語法的一些黑暗角落的交集處。
首先,需要逗號來創建一個包含執行緒編號的單個元素的元組:
>>> 6
6
>>> 6,
(6,)
>>> (6,)
(6,)
>>> (6)
6
看?沒有逗號,或者只有括號,6 就是 int 6。但是有了逗號——不管有沒有括號——它變成了一個包含 int 6 作為其唯一元素的元組。
為什么它需要是一個元組?您很快就會被告知它實際上沒有 ;-) ,但在此之前請考慮您可能需要將任意數量的引數傳遞給執行緒。所以后面的運算式args=必須產生一個序列。
但是如果逗號的出現構成了一個元組,為什么還需要括號呢?這是“一些黑暗角落的交叉點”:引數串列中的逗號也分隔引數,并且在這種情況下優先。因此需要括號來強制執行意圖:“這個逗號并不意味著下一個引數開始 - 這個逗號意味著我想要一個元組”。
為了避免考慮所有這些,您可以在這種情況下使用串列作為序列:
t = threading.Thread(target=access, args=[thread_number])
的實作Thread并不關心將哪種序列作為 的值傳遞args=,并且很多代碼實際上使用的是串列而不是元組。但是,我上次查看時,沒有記錄在案,因此有點冒險。
uj5u.com熱心網友回復:
如果你添加逗號,那么對于 python,它是一個元組,空括號也是元組
>>> type( (1,) )
<class 'tuple'>
>>> type( (1) )
<class 'int'>
>>> type( (1,2))
<class 'tuple'>
>>> type( () )
<class 'tuple'>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/349903.html
下一篇:從日志中回傳最頻繁的IP地址
