首頁  >  問答  >  主體

python小白問題 關於局部變數和全域變數

第一段程式碼:

#
# -*- coding:gb2312 -*-
nums = [11,22,33,44,55]

def nums_chang():
    nums = [11,22,33,44,55,999]
    print(nums)

nums_chang() # 打印出来是[11,22,33,44,55,999]
print(nums)  # 打印出来是[11,22,33,44,55]

運行結果:

##第二段程式碼:

#
# -*- coding:gb2312 -*-
nums = [11,22,33,44,55]

def nums_chang():
    nums.append(999)  # 打印出来是[11,22,33,44,55,999]
    print(nums)       # 打印出来是[11,22,33,44,55,999]

nums_chang()
print(nums)

運行結果:

##我的問題是:
為什麼第一段程式碼會印出來兩個結果是不一樣的,而第二段程式碼印出來的結果是一樣的?特別是第二段程式碼,為什麼函數裡面的append指令,可以修改外面的全域變數。而第一段程式碼當中,重新定義一次列表,卻無法修改外面的全域變數?這裡的原因是什麼?

学习ing学习ing2686 天前1065

全部回覆(3)我來回復

  • 仅有的幸福

    仅有的幸福2017-06-12 09:26:56

    看了下採納答案,我覺得還是沒說到點子上面。
    首先nums變數被定義為了全域變數,也就說在這個".py"檔裡面,所有類別、函數都可以使用它。但是所有變數也是一個對象,而對象分為可變和不可變。而列表是可變對象,也就是說可以變更。那什麼是可變物件?就是那些可以對物件操作,而不影響在記憶體中的生滅。入x="234",如果你再賦值,x="111"。其實兩個x已經是兩個物件了,只是覆蓋了而已,即x = x + "123",x也是一個新物件。

    如果是列表,x = [1,2,3],現在對它操作,x.remove(1),那麼x對象還是x對象,只是對象的值有改變

    第一段程式碼:就是重新賦值,在不同的作用域,nums賦值了一遍,這樣全域變數nums和nums_chang函數裡面的nums變數就不再是一個對象,他們是不同的,因此你印出來的時候出現了不同的值,此時nums_chang函數裡面的nums變數已經是局部變量,只給這個函數使用

    第二段程式碼:nums是個列表,是可變對象,因此對列表的操作,不影響這個對象,因此這個對象還是全局中的那個,函數和外面都是用的全局變量,因此你修改了之後,全域變數的值也跟著修改了

    回覆
    0
  • 天蓬老师

    天蓬老师2017-06-12 09:26:56

    第一: 關於作用域的問題, 可以先參考下我的一篇文章: Python: 作用域(scope) 和LEGB, 可以先對變量的查找有個基本的認識,然後我們能夠看到,因為有賦值語句, 所以nums只會從局部作用域找出,並不會跟全域作用域有關係

    第二: 在第一的基礎上, 我們可以看到nums.append(999)中的nums是從全局作用域找到的, 又因為用的是append方法, 這方法找到的, 又因為用的是append

    方法, 這方法🎜找到的, 這方法是直接用於來源列表本身, 所以你看到全域的🎜nums🎜也被更新了🎜

    回覆
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-12 09:26:56

    函數在自己的作用域找不到變量,就回去上一級作用域找,你的第二個就是這樣來的。
    第一個的話,和明顯你賦值了呀

    回覆
    0
  • 取消回覆