python小白問題 關(guān)于局部變量和全局變量
問題描述
第一段代碼:
# -*- 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]
運行結(jié)果:
第二段代碼:
# -*- 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)
運行結(jié)果:
我的問題是:為什么第一段代碼打印出來兩個結(jié)果是不一樣的,而第二段代碼打印出來的結(jié)果是一樣的? 特別是第二段代碼,為什么函數(shù)里面的append命令,可以修改外面的全局變量。而第一段代碼當(dāng)中,重新定義一次列表,卻無法修改外面的全局變量? 這里的原因是什么?
問題解答
回答1:看了下采納答案,我覺得還是沒說到點子上面。首先nums變量被定義為了全局變量,也就說在這個'.py'文件里面,所有類、函數(shù)都可以使用它。但是所有變量也是一個對象,而對象分為可變和不可變。而列表是可變對象,也就是說可以變更。那么什么是可變對象?就是那些可以對對象操作,而不影響在內(nèi)存中的生滅。入x='234',如果你再賦值,x='111'。其實兩個x已經(jīng)是兩個對象了,只是覆蓋了而已,即x = x + '123',x也是一個新對象。
如果是列表,x = [1,2,3],現(xiàn)在對它操作,x.remove(1),那么x對象還是x對象,只是對象的值有改變
第一段代碼:就是重新賦值,在不同的作用域,nums賦值了一遍,這樣全局變量nums和nums_chang函數(shù)里面的nums變量就不再是一個對象,他們是不同的,因此你打印的時候出現(xiàn)了不同的值,此時nums_chang函數(shù)里面的nums變量已經(jīng)是一個局部變量,只給這個函數(shù)使用
第二段代碼:nums是個列表,是可變對象,因此對列表的操作,不影響這個對象,因此這個對象還是全局中的那個,函數(shù)和外面都是用的全局變量,因此你修改了之后,全局變量的值也跟著修改了
回答2:第一: 關(guān)于作用域的問題, 可以先參考下我的一篇文章: Python: 作用域(scope) 和 LEGB, 可以先對變量的查找有個基本的認(rèn)識,然后我們能夠看到, 因為有賦值語句, 所以nums只會只會從局部作用域查找,并不會和全局作用域有關(guān)系
第二: 在第一的基礎(chǔ)上, 我們可以看到nums.append(999)中的nums是從全局作用域找到的, 又因為用的是append方法, 這方法是直接用于源列表本身, 所以你看到全局的nums也被更新了
回答3:函數(shù)在自己的作用域找不到變量,就回去上一級作用域找,你的第二個就是這樣來的。第一個的話,和明顯你賦值了呀
相關(guān)文章:
1. linux - 編譯時提示頭文件#include <mysql/mysql.h>不存在,百度之后也沒解決2. python - openpyxl讀取xlsx文件把數(shù)據(jù)生成字典,中文編碼問題?3. node.js - mac下vue-cli構(gòu)建的項目為啥在windows就報錯呢?4. python - beautifulsoup獲取網(wǎng)頁內(nèi)容的問題5. mysql主從復(fù)制 REPLICATE_DO_DB 參數(shù)從服務(wù)器reboot后每次都回滾為初始設(shè)置6. mysql索引 - mysql的表如何重新組織(或生成)索引?7. python小白的基礎(chǔ)問題 關(guān)于while循環(huán)的嵌套8. 設(shè)置 mysql 的 root用戶 可以被外網(wǎng)訪問后的問題9. django - Python error: [Errno 99] Cannot assign requested address10. python - linux怎么在每天的凌晨2點執(zhí)行一次這個log.py文件
