Kod pertama:
# -*- 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]
Hasil larian:
Kod kedua:
# -*- 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)
Hasil larian:
Soalan saya ialah:
Mengapa kedua-dua hasil yang dicetak oleh kod pertama berbeza, tetapi hasil yang dicetak oleh kod kedua adalah sama? Terutamanya sekeping kod kedua, mengapa arahan tambah dalam fungsi boleh mengubah suai pembolehubah global di luar. Dalam sekeping kod pertama, senarai itu ditakrifkan semula, tetapi pembolehubah global luaran tidak boleh diubah suai? Apa sebab di sini?
Selepas membaca jawapan yang diterima, saya rasa saya masih terlepas perkara itu.
Pertama sekali, pembolehubah nums ditakrifkan sebagai pembolehubah global, yang bermaksud bahawa dalam fail ".py" ini, semua kelas dan fungsi boleh menggunakannya. Tetapi semua pembolehubah juga merupakan objek, dan objek dibahagikan kepada boleh berubah dan tidak berubah. Senarai adalah objek boleh ubah, yang bermaksud ia boleh diubah. Jadi apakah objek boleh berubah? Mereka adalah mereka yang boleh beroperasi pada objek tanpa menjejaskan penciptaan dan kematian mereka dalam ingatan. Masukkan x="234", dan jika anda menetapkan nilai lain, x="111". Sebenarnya, dua x itu sudah menjadi dua objek, ia hanya ditutup, iaitu, x = x + "123", dan x juga merupakan objek baru.
Jika ia adalah senarai, x = [1,2,3], sekarang beroperasi padanya, x.remove(1), maka objek x masih objek x, tetapi nilai objek telah berubah
Sekeping kod pertama: Ia adalah penugasan semula Dalam skop yang berbeza, nombor ditetapkan semula, supaya nombor pembolehubah global dan pembolehubah nombor dalam fungsi nums_chang tidak lagi menjadi objek yang sama, jadi ia muncul apabila anda mencetak nilai yang berbeza Pada masa ini, pembolehubah nums dalam fungsi nums_chang sudah menjadi pembolehubah tempatan dan hanya digunakan oleh fungsi ini
Sekeping kod kedua: nums ialah senarai dan objek berubah, jadi operasi pada senarai tidak menjejaskan objek ini, jadi objek ini masih bersifat global Pembolehubah global digunakan dalam fungsi dan di luar, jadi selepas anda ubah suainya, nilai pembolehubah global juga diubah suaiPertama: Berkenaan isu skop, anda boleh merujuk kepada salah satu artikel saya dahulu: Python: Scope dan LEGB, anda boleh membandingkan dahulu
变量
的查找有个基本的认识,然后我们能够看到, 因为有赋值语句
, 所以nums
Ia hanya akan mencari dari skop tempatan dan tidak akan berinteraksi dengan skop globalKedua: Berdasarkan yang pertama, kita dapat lihat bahawa
nums.append(999)
中的nums
是从全局作用域
找到的, 又因为用的是append
方法, 这方法是直接用于源列表本身, 所以你看到全局的nums
juga telah dikemas kiniJika fungsi tidak dapat mencari pembolehubah dalam skopnya sendiri, ia akan kembali ke skop sebelumnya untuk mencarinya Beginilah cara yang kedua anda terhasil.
Jika ia yang pertama, jelas sekali anda telah memberi nilai