Rumah > Soal Jawab > teks badan
Kod pertama:
# -*- coding:gb2312 -*-
a = [100]
def test(num):
num += num #第一段代码
print(num)
test(a)
print(a)
Hasil pelaksanaan:
Kod kedua:
# -*- coding:gb2312 -*-
a = [100]
def test(num):
num = num + num #这个地方改了一下
print(num)
test(a)
print(a)
Hasil pelaksanaan:
Soalan saya:
num += num tidak sepatutnya bersamaan langsung dengan mun = num+num Mengapakah keputusan yang dikira berbeza? Apa yang sedang berlaku
大家讲道理2017-06-13 09:26:36
Boleh cuba buat macam ni,
In [1]: a = [100]
In [2]: b = [100]
In [3]: id(a)
Out[3]: 79308552L
In [4]: id(b)
Out[4]: 79342728L
In [5]: a += a
In [6]: b = b + b
In [7]: id(a)
Out[7]: 79308552L
In [8]: id(b)
Out[8]: 79341192L
Alamat memori yang diperuntukkan kepada pembolehubah boleh diperolehi melalui fungsi id(). Melalui eksperimen, didapati bahawa alamat pembolehubah menggunakan +
telah berubah, iaitu apa yang anda katakan num+=num dan num=num+numbukan bersamaan.
Namun, apabila anda melakukan operasi seksi berikut, anda akan mendapati diri anda ditampar di muka
In [19]: a = (0,)
In [20]: b = (0,)
In [21]: id(a)
Out[21]: 82230688L
In [22]: id(b)
Out[22]: 82208920L
In [23]: a += a
In [24]: b = b + b
In [25]: id(a)
Out[25]: 79268296L
In [26]: id(b)
Out[26]: 79328392L
Alamat yang diberikan nampaknya berubah sepanjang masa.
Sebabnya ialah struktur data dalam Python dibahagikan kepada boleh berubah dan tidak boleh diubah.
Untuk jenis pembolehubah, = dan += jelas berbeza, seperti yang ditunjukkan dalam senarai di atas:
+ mewakili operasi sambungan, += mewakili penambahan
Untuk jenis tidak berubah, = dan += adalah operasi yang sama, seperti tupel di atas
Intipati jenis pembolehubah dan jenis tidak berubah terletak pada sama ada ruang memori berubah~
PHP中文网2017-06-13 09:26:36
Perkara pertama yang perlu diperhatikan ialah perbezaannya
In [26]: def test(num):
...: num = num + num
...: print (num)
...:
In [27]: def test1(num):
...: num += num
...: print (num)
...:
In [28]: import dis
In [29]: dis.dis(test)
2 0 LOAD_FAST 0 (num)
3 LOAD_FAST 0 (num)
6 BINARY_ADD #区别在这儿
7 STORE_FAST 0 (num)
3 10 LOAD_FAST 0 (num)
13 PRINT_ITEM
14 PRINT_NEWLINE
15 LOAD_CONST 0 (None)
18 RETURN_VALUE
In [30]: dis.dis(test1)
2 0 LOAD_FAST 0 (num)
3 LOAD_FAST 0 (num)
6 INPLACE_ADD #看这儿
7 STORE_FAST 0 (num)
3 10 LOAD_FAST 0 (num)
13 PRINT_ITEM
14 PRINT_NEWLINE
15 LOAD_CONST 0 (None)
18 RETURN_VALUE
Anda dapat melihat bahawa kaedah yang dipanggil adalah berbeza, ia adalah __add__, __iadd__
Operator penambahan akan mengira objek baharu untuk diberikan kepada num
Operator penugasan tambahan mengubah suai rujukan asal
Rujukan di sini: https://stackoverflow.com/que...
滿天的星座2017-06-13 09:26:36
Ingat bahawa hujah diluluskan oleh tugasan dalam Python
Dalam Python, tugasan digunakan untuk menghantar parameter, bukan rujukan, jadi apabila anda menghantar a kepada fungsi, anda lulus nilai a, bukan a sendiri. Jika anda ingin menukar sendiri, anda perlu menggunakan pulangan untuk menghantar nilai semula
a = [100]
def test(num):
num = num + num #这个地方改了一下
return(num) #这个地方再改了一下
print(test(a)) #傳值回來
print(a)
a = test(a)
print(a)
Hasil:
[100, 100]
[100]
[100, 100]
世界只因有你2017-06-13 09:26:36
Dalam ular sawa, a=a+b perlu mencipta objek baharu dahulu dan biarkan pembolehubah a merujuk kepada objek ini a+=b ialah menukar nilai objek yang dirujuk oleh a menjadi nilai a+b.