python為什麼不需要swap a,b

2021-08-25 16:00:40 字數 1674 閱讀 1697

關鍵字:python ,

swap

**:致 謝:這是一篇譯稿,原作者是一位nasa的程式設計師,非常感謝他在python社群及時、詳細的為我解答了問題,並在講解中解說了一些python的相關知 識,還寬容的對待我蹩腳的英語。感謝他同意我將他的來信介紹給大家。這是一位謙和有禮又博學多才的朋友。他幫我理解python之美,也讓我看到人性之 美。

問:python中為什麼沒有swap(a, b)方法?我們在python中如何交換物件?

python 不使用這種方式(swap(a, b))。python以引用方式管理物件,你可以交換引用,但通常不能交換記憶體中的物件值。當然你也不需要這樣做。

在c++中這種函式用來交換「a和b的值」。在python中,a和b的值不會發生交換,但位於當前命名空間中的標記(如a和b)是可以交換的。而物件本身是仍然保留。

所以與其呼叫乙個swap(a, b),你倒不如使用:a,b = b,a。

通常python函式不會混淆它們的命名空間,所以它不能像c++的swap(&a, &b)那樣進行引用操作。

因此,在python中應該這樣做:

a = 1

b = 2

def swap(t1, t2):

return t2, t1

a,b = swap(a, b)   # after this point, a == 2 and b == 1

but there is not way (other than abusing globals or the module

namespace) to do it like this:

不過下面這段**不可能像我們希望的那樣工作(全域性命名空間和區域性命名空間是隔離的):

a = 1

b = 2

def swap(t1, t2):

t2, t1 = t1, t2

return

swap(a, b)

# after this point, a == 1 and b == 2.  the calling namespace is

# not changed.

在類中,你可以構造乙個命名空間來操作可呼叫的物件(類例項方法),事實上,這意味著也許可以實現乙個swap()方法。但是它們仍然只是操作命名空間中的物件引用,而不會交換物件本身(或者它們在機器記憶體中的資料)。以下只是乙個示例,並不表示它們有什麼實用性:

class pair:

def __init__(self, t1, t2):

self.t1 = t1

self.t2 = t2

def get(self):

return self.t1, self.t2

def swap(self):

self.t1, self.t2 = self.t2, self.t1

a = 1

b = 2

pair = pair(a, b)

pair.get()   # returns 1,2

pair.swap()  # changes the namespace of the pair object

pair.get()   # returns 2,1

a == 1

b == 2       # the a and b labels did not change

python 中為什麼不需要過載

函式過載主要是為了解決兩個問題。1 可變引數型別。2 可變引數個數。另外,乙個基本的設計原則是,僅僅當兩個函式除了引數型別和引數個數不同以外,其功能是完全相同的,此時才使用函式過載,如果兩個函式的功能其實不同,那麼不應當使用過載,而應當使用乙個名字不同的函式。好吧,那麼對於情況 1 函式功能相同,但...

為什麼 Linux 不需要碎片整理

想要知道為什麼在正常使用中,linux檔案系統不需要進行碎片整理,而windows要。你需要了解為什麼會生成碎片,而linux和windows這兩個檔案系統,它們分別是如何工作的。什麼是碎片 許多windows使用者,即使沒有太多經驗,我相信他們也會定期進行碎片整理,來加速其電腦。為什麼要這麼做,許...

為什麼Linux不需要碎片整理?

出處 極客範 如果你是乙個linux使用者,你可能會聽說linux的檔案系統不需要碎片整理。你也可能會注意到linux的發行版本也都沒有磁碟碎片整理的功能。這是為什麼呢?linux系統中沒有 磁碟碎片整理 功能 要理解為什麼linux的檔案系統不會想windows的檔案系統一樣產生碎片,你首先要明白...