1. 程式人生 > >Python3:經典引數傳遞錯誤(你要是能回答對,來打我)

Python3:經典引數傳遞錯誤(你要是能回答對,來打我)

先出題再說:

1.傳入int 型別

def add(a,b):
    a+=b
    return a
a=1
b=2
c=add(a,b)

print(a,b,c)

不執行的情況下,自己先看看會有什麼結果?

2.傳入list 型別

def add(a,b):
    a+=b
    return a
a=[1]
b=[2]
c=add(a,b)

print(a,b,c)

同樣不執行的情況下,自己先看看會有什麼結果?

3.傳入 tuple

def add(a,b):
    a+=b
    return a
a=(1)
b=(2)
c=add(a,b)

print(a,b,c)

同樣不執行的情況下,自己先看看會有什麼結果?

現在開始公佈答案

  1. 1 2 3
  2. [1, 2] [2] [1, 2]
  3. 1 2 3

要是你答對了,可以來打我了。 座標 上海 , 具體地址請找我要(qq:794880479)

沒有答對的小夥伴一定很想知道原理。

我來解釋下

通過以上的答案可以發現 只有list型別 a的值變化了

1.list的特性是可變性

def add(a,b):
    print(id(a))
    a+=b
    print(id(a))
    return a
a=[1]
b=[2]
c=add(a,b)

print(a,b,c)

列印結果如下:

2705123109192
2705123109192
[1, 2] [2] [1, 2]

通過ID 的比較說明 傳入的a 和 a+=b的id 一樣,
可以得出他直接修改a指標的值,並不會建立新的指標,所以他們是一樣的。

同樣的方法咱們測試下 int型別的

def add(a,b):
    print(id(a))
    a+=b
    print(id(a))
    return a
a=1
b=2
c=add(a,b)

print(a,b,c)

列印結果:

1409444880
1409444944
1 2 3

和我們的預料的情況一樣,a+=b 並沒有修改a的指標對應的value,而是另外
建立了一個指標,並把指標交給了C,函式執行結束,這個a的另外指標也就沒有了

當列印a的時候,當然還是 最初的 a=1的值 。

如果看到我的解釋還是不理解,請看我的部落格_變數的本質。看過後保證很清晰。

再提下 dict 和list 一樣的原理 ,自己可以嘗試下。