Newbie Python bertanya tentang perbezaan antara a+=a dan a=a+a
三叔
三叔 2017-06-13 09:24:36
0
4
1163

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

三叔
三叔

membalas semua(4)
大家讲道理

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~

洪涛

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...

滿天的星座

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]
世界只因有你

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan