真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python變量如何使用-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!

在吉州等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需求定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,全網(wǎng)整合營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),吉州網(wǎng)站建設(shè)費用合理。

Python變量如何使用?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

Python編程中經(jīng)常遇到一些莫名其妙的錯誤, 其實這不是語言本身的問題, 而是我們忽略了語言本身的一些特性導(dǎo)致的,今天就來看下使用Python變量時導(dǎo)致的3個不可思議的錯誤, 以后在編程中要多多注意。

1、 可變數(shù)據(jù)類型作為函數(shù)定義中的默認參數(shù)

這似乎是對的?你寫了一個小函數(shù),比如,搜索當前頁面上的鏈接,并可選將其附加到另一個提供的列表中。

def search_for_links(page, add_to=[]):
    new_links = page.search_for_links()
    add_to.extend(new_links)
    return add_to

從表面看,這像是十分正常的 Python 代碼,事實上它也是,而且是可以運行的。但是,這里有個問題。如果我們給 add_to 參數(shù)提供了一個列表,它將按照我們預(yù)期的那樣工作。但是,如果我們讓它使用默認值,就會出現(xiàn)一些神奇的事情。

試試下面的代碼:

def fn(var1, var2=[]):
    var2.append(var1)
    print(var2)
fn(3)
fn(4)
fn(5)

可能你認為我們將看到:

[3]
[4]
[5]

但實際上,我們看到的卻是:

[3]
[3,4]
[3,4,5]

為什么呢?如你所見,每次都使用的是同一個列表,輸出為什么會是這樣?在 Python 中,當我們編寫這樣的函數(shù)時,這個列表被實例化為函數(shù)定義的一部分。當函數(shù)運行時,它并不是每次都被實例化。這意味著,這個函數(shù)會一直使用完全一樣的列表對象,除非我們提供一個新的對象:

fn(3,[4])
[4,3]

答案正如我們所想的那樣。要想得到這種結(jié)果,正確的方法是:

def fn(var1, var2=None):
    ifnot var2:
        var2 =[]
    var2.append(var1)

2、 可變數(shù)據(jù)類型作為類變量

這和上面提到的最后一個錯誤很相像。思考以下代碼:

class URLCatcher(object):
    urls =[]
    def add_url(self, url):
        self.urls.append(url)

這段代碼看起來非常正常。我們有一個儲存 URL 的對象。當我們調(diào)用 add_url 方法時,它會添加一個給定的 URL 到存儲中??雌饋矸浅U_吧?讓我們看看實際是怎樣的:

a =URLCatcher()
a.add_url('http://www.google.com')
b =URLCatcher()
b.add_url('http://www.pythontab.com')
print(b.urls)
print(a.urls)

結(jié)果

['http://www.google.com','http://www.pythontab.com']
['http://www.google.com','http://www.pythontab.com']

等等,怎么回事?!我們想的不是這樣啊。我們實例化了兩個單獨的對象 a 和 b。把一個 URL 給了 a,另一個給了 b。這兩個對象怎么會都有這兩個 URL 呢?

這和第一個錯例是同樣的問題。創(chuàng)建類定義時,URL 列表將被實例化。該類所有的實例使用相同的列表。在有些時候這種情況是有用的,但大多數(shù)時候你并不想這樣做。你希望每個對象有一個單獨的儲存。為此,我們修改代碼為:

class URLCatcher(object):
    def __init__(self):
        self.urls =[]
    def add_url(self, url):
        self.urls.append(url)

現(xiàn)在,當創(chuàng)建對象時,URL 列表被實例化。當我們實例化兩個單獨的對象時,它們將分別使用兩個單獨的列表。

3、 可變的分配錯誤

這個問題困擾了我一段時間。讓我們做出一些改變,并使用另一種可變數(shù)據(jù)類型 - 字典。

a ={'1':"one",'2':'two'}

現(xiàn)在,假設(shè)我們想把這個字典用在別的地方,且保持它的初始數(shù)據(jù)完整。

b = a
b['3']='three'

現(xiàn)在,讓我們看看原來那個我們不想改變的字典 a:

{'1':"one",'2':'two','3':'three'}

哇等一下,我們再看看 b?

{'1':"one",'2':'two','3':'three'}

等等,什么?有點亂……讓我們回想一下,看看其它不可變類型在這種情況下會發(fā)生什么,例如一個元組:

c =(2,3)
d = c
d =(4,5)

現(xiàn)在 c 是 (2, 3),而 d 是 (4, 5)。

這個函數(shù)結(jié)果如我們所料。那么,在之前的例子中到底發(fā)生了什么?當使用可變類型時,其行為有點像 C 語言的一個指針。在上面的代碼中,我們令 b = a,我們真正表達的意思是:b 成為 a 的一個引用。它們都指向 Python 內(nèi)存中的同一個對象。聽起來有些熟悉?那是因為這個問題與先前的相似。

列表也會發(fā)生同樣的事嗎?是的。那么我們?nèi)绾谓鉀Q呢?這必須非常小心。如果我們真的需要復(fù)制一個列表進行處理,我們可以這樣做:

b = a[:]

這將遍歷并復(fù)制列表中的每個對象的引用,并且把它放在一個新的列表中。但是要注意:如果列表中的每個對象都是可變的,我們將再次獲得它們的引用,而不是完整的副本。

假設(shè)在一張紙上列清單。在原來的例子中相當于,A 某和 B 某正在看著同一張紙。如果有個人修改了這個清單,兩個人都將看到相同的變化。當我們復(fù)制引用時,每個人現(xiàn)在有了他們自己的清單。但是,我們假設(shè)這個清單包括尋找食物的地方。如果“冰箱”是列表中的第一個,即使它被復(fù)制,兩個列表中的條目也都指向同一個冰箱。所以,如果冰箱被 A 修改,吃掉了里面的大蛋糕,B 也將看到這個蛋糕的消失。這里沒有簡單的方法解決它。只要你記住它,并編寫代碼的時候,使用不會造成這個問題的方式。

字典以相同的方式工作,并且你可以通過以下方式創(chuàng)建一個昂貴副本:

b = a.copy()

再次說明,這只會創(chuàng)建一個新的字典,指向原來存在的相同的條目。因此,如果我們有兩個相同的列表,并且我們修改字典 a 的一個鍵指向的可變對象,那么在字典 b 中也將看到這些變化。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。


網(wǎng)頁題目:Python變量如何使用-創(chuàng)新互聯(lián)
本文地址:http://weahome.cn/article/jdcjp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部