亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

函數調用的輸出

函數調用的輸出

開心每一天1111 2022-11-29 17:20:37
我目前是 python 的新手,我仍在學習基礎知識,但有一件事我無法理解。為什么 Q.1 中的代碼給出了輸出 3,而 Q.2 給出了輸出 [4]?當被問到時,我被告知 Q.1 底部的 f(x) 行沒有給出任何變量或框來保存 def 給出的新返回值。這就是為什么 x 的輸出仍然是 3 的原因。這對我來說很有意義,但是為什么 Q.2 中的輸出會等于 g(x) 的返回值?這段代碼中也沒有任何變量或框來包含 x 的返回值。Q.1:def f(x):    x += 1    return xx=3f(x)print(x)問題 2:def g(x):    x[0] = x[0] + 1    return xx = [3]g(x)print(x)
查看完整描述

4 回答

?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

當參數是“復雜的”時,Python 函數通過引用獲取參數(指向真實對象的東西),當它是簡單的東西時通過值(項目的副本)獲取參數。

Q.1 將 int 作為參數,然后函數創建它的內部副本,因此不會在函數外部修改 x 的值。

Q.2 將一個列表作為一個參數,這被認為是復雜的,在這種情況下,該函數引用了原始列表,并且該引用發生的任何事情也將發生在原始列表上。

您可以在此處找到帶圖像的按引用傳遞和按值傳遞的解釋


查看完整回答
反對 回復 2022-11-29
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

定義的函數是 Q1 返回一個 for 值。x 包含 3 并通過調用函數傳遞給函數f(x)。它會遞增并返回到函數調用。但是,函數調用沒有存儲在變量中,所以它沒有保存到內存中。沒有對返回值進行任何處理。調用該函數只是在局部范圍內(在函數內)編輯變量 x。當你使用print(x)它時,它引用了 x 的全局變量,它仍然包含 3。

在第二季度,列表是可變的。在函數內編輯它們,更改在全局范圍內持續存在。因為該列表在全局范圍內發生了變化,所以 usingprint(x)使用更新后的全局變量。

我希望這是有道理的。查看文檔中變量的范圍以獲取更多信息。


查看完整回答
反對 回復 2022-11-29
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

在 Python 中,列表是可變對象,因此它們在函數調用中使用時通過引用傳遞。這意味著當 g(x) 將 x 的第一個元素加 1 時,函數退出后,原始列表 x 將包含這些更改。

請注意,使用的特定術語不是“按引用傳遞”,而是“按名稱傳遞”,它帶有幾個不同的語義,您可以根據需要了解更多信息。


查看完整回答
反對 回復 2022-11-29
?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

Q1


def f(x):

    x += 1

    return x

x=3

f(x)

print(x)

返回 3 而不是 4 的原因是因為您沒有反彈變量來引用這個新值。而不是f(x)你可以做x = f(x)。


Q2


def g(var):

    var[0] = var[0] + 1

    return var

x = [3]

g(x)

print(x)

為了在不混淆的情況下回答這個問題,我將函數中使用的局部變量更改為 var,這樣您就可以更輕松地了解我想向您解釋的內容。


首先,您在列表的第一個位置(元素 0)創建一個整數值為 3 的列表,并讓 x 引用該列表。


當您調用 g() 函數并傳遞列表時,該函數將 var 設置為引用相同的列表(不是不同的列表,而是相同的列表)。然后,您告訴該函數將第一個元素中的整數值增加 1。由于列表在某些方法中是可變的,因此您已經更改了局部變量 var 和全局變量 x 的列表。這意味著您實際上不需要使用函數的任何返回值,因為列表已經就地改變了。


看看這個視頻https://youtu.be/_AEJHKGk9ns Ned Batchelder 對此有更多解釋。



查看完整回答
反對 回復 2022-11-29
  • 4 回答
  • 0 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號