簡體   English   中英

Python:對象列表與整數行為列表

[英]Python: list of objects vs list of integers behavior

我是該語言的新手,對Python的引用有些困惑。

考慮以下代碼:

class A:
  def __init__(self, x):
    self.x = x

a = A(3)
v=[a]
print(f'obj before: v[0].x={v[0].x}')
a.x = a.x + 1
print(f'obj after:  v[0].x={v[0].x}')

b = 3
w=[b]
print(f'int before: w[0]={w[0]}')
b = b + 1
print(f'int after:  w[0]={w[0]}')

=====================輸出:

obj before: v[0].x=3
obj after:  v[0].x=4
int before: w[0]=3
int after:  w[0]=3

為什么代碼的obj和int版本工作方式不同?

執行此操作時,您正在修改對象a

a.x = a.x + 1

在執行此操作時,您正在更改變量b所指的內容:

b = b + 1

換句話說,有一個很大的區別bx在上面的代碼: b是一個變量, x是的屬性a

向變量分配某些內容不會修改任何對象,因此只會影響進行分配的變量* ,而設置屬性的值則會修改該對象,這可以在引用該對象的任何變量中看到。


*影響垃圾收集器的refcounts也有變化,但是現在不相關了。

a = A(3)

變量a指向對象。

v = [a]

v的第一個元素指向同一對象。

斧=斧+ 1

更改對象的屬性“ x”。

v仍包含相同的對象,但其屬性已更改。

b = 3

變量b指向對象3。

w = [b]

w的第一個元素也指向對象3。

b = b + 1

b現在指向對對象3和對象1(即對象4)進行加法運算時得到的結果。

w仍然包含對象3。您從未更改此對象的任何屬性,也從未更改w的第一個元素指向的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM