[英]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
換句話說,有一個很大的區別b
和x
在上面的代碼: 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.