溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

3個(gè)看似簡單的Python問題是什么

發(fā)布時(shí)間:2021-11-02 09:14:53 來源:億速云 閱讀:119 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“3個(gè)看似簡單的Python問題是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“3個(gè)看似簡單的Python問題是什么”吧!

問題1

假設(shè)我們有幾個(gè)變量:

x = 1 y = 2 l = [x, y] x += 5 a = [1] b = [2] s = [a, b] a.append(5)

l和s的打印結(jié)果是什么?

跳到解決方案

問題2

讓我們定義一個(gè)簡單的函數(shù):

def f(x, s=set()): s.add(x) print(s)

如果您決定,將會(huì)發(fā)生什么:

>>f(7)  >>f(6, {4, 5})  >>f(2)  ?

跳到解決方案

問題3

讓我們定義兩個(gè)簡單的函數(shù):

def f():     l = [1]     def inner(x):         l.append(x)         return l     return inner def g():     y = 1     def inner(x):         y += x         return y     return inner

以下命令將產(chǎn)生什么結(jié)果?

>>ff_inner = f() >>print(f_inner(2)) >>gg_inner = g() >>print(g_inner(2))

跳到解決方案

您對(duì)自己的回答有多自信? 讓我們看看您是否正確。

解決問題1

>>print(l)  [1, 2]  >>print(s)  [[1, 5], [2]]

為什么第二個(gè)列表對(duì)第一個(gè)元素a.append(5)的更改有反應(yīng),但是第一個(gè)列表完全忽略x + = 5的類似變化?

解決問題2

讓我們看看發(fā)生了什么:

>>f(7){7}  >>f(6, {4, 5}){4, 5, 6}  >>f(2){2, 7}

等待,最后輸出不是{2}嗎?

解決問題3

輸出將是以下內(nèi)容:

>>ff_inner = f()  >>print(f_inner(2))[1, 2]  >>gg_inner = g()  >>print(g_inner(2))  UnboundLocalError: local variable 'y' referenced before assignment

為什么g_inner(2)不輸出3? f()的內(nèi)部函數(shù)如何記住其外部范圍,而g()的內(nèi)部函數(shù)卻不記得呢? 它們實(shí)際上是相同的!

說明

如果我告訴您這些怪異的行為與Python中可變對(duì)象和不可變對(duì)象之間的區(qū)別有關(guān)怎么辦?

諸如列表,集合或字典之類的可變對(duì)象可以在適當(dāng)位置進(jìn)行更改(變異)。 不變的對(duì)象(如整數(shù),字符串和元組)不能—此類對(duì)象的"更改"會(huì)導(dǎo)致創(chuàng)建新對(duì)象。

問題1的說明

x = 1 y = 2 l = [x, y] x += 5 a = [1] b = [2] s = [a, b] a.append(5) >>print(l) [1, 2] >>print(s) [[1, 5], [2]]

由于x是不可變的,因此操作x + = 5不會(huì)更改原始對(duì)象,而是創(chuàng)建一個(gè)新對(duì)象。 列表的第一個(gè)元素仍指向原始對(duì)象,因此其值保持不變。

對(duì)于可變對(duì)象a,a.append(5)更改原始對(duì)象,因此list s"看到"更改。

問題2的解釋

def f(x, s=set()):     s.add(x)     print(s) >>f(7) {7} >>f(6, {4, 5}) {4, 5, 6} >>f(2) {2, 7}

前兩個(gè)輸出完全有意義:首先將值7添加到默認(rèn)空集中,得到{7},然后將值6添加到一組{4,5}中,得到{4,5,6 }。

但是隨后發(fā)生了一件奇怪的事情:將值2添加到默認(rèn)的空集而不是添加到{7}的集。 為什么?  可選參數(shù)s的默認(rèn)值僅被評(píng)估一次-僅在第一次調(diào)用s期間將被初始化為空集。 由于s在調(diào)用f(7)之后是可變的,因此就地進(jìn)行了修改。  第二個(gè)調(diào)用f(6,{4,5})不會(huì)影響默認(rèn)參數(shù)-提供的集合{4,5}將其遮蔽,換句話說,{4,5}是一個(gè)不同的變量。  第三次調(diào)用f(2)使用的是與第一次調(diào)用相同的s變量,但是s未作為空集重新初始化-使用了其先前的值{7}。

這就是為什么您不應(yīng)該使用可變的默認(rèn)參數(shù)的原因。 在這種情況下,應(yīng)按以下方式修改功能:

def f(x, s=None):     if s is None:         s = set()     s.add(x)     print(s)

問題3的解釋

def f():     l = [1]     def inner(x):         l.append(x)         return l     return inner def g():     y = 1     def inner(x):         y += x         return y     return inner >>ff_inner = f() >>print(f_inner(2)) [1, 2] >>gg_inner = g() >>print(g_inner(2)) UnboundLocalError: local variable ‘y’ referenced before assignment

在這個(gè)問題中,我們處理閉包-內(nèi)部函數(shù)記住定義時(shí)它們的封閉名稱空間的外觀。 或至少應(yīng)該如此-第二個(gè)功能保持撲克面孔,就像從未聽說過其外部作用域一樣。

這是為什么? 當(dāng)我們執(zhí)行l(wèi).append(x)時(shí),在定義時(shí)創(chuàng)建的可變對(duì)象被修改,但是變量l仍然指向內(nèi)存中的相同地址。 但是,嘗試更改第二個(gè)函數(shù)y + =  x中的不可變變量會(huì)導(dǎo)致y指向內(nèi)存中與以前不同的地址-原始y將不再被記住,因此導(dǎo)致UnboundLocalError。

到此,相信大家對(duì)“3個(gè)看似簡單的Python問題是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI